Получите ошибку нарушения внешнего ключа

0

Я получаю проблемы при вставке данных в базу данных. Это вызывает ошибку:

SQLSTATE [23000]: нарушение ограничений целостности: 1452 Невозможно добавить или обновить sipp-litbang1 строку: ограничение внешнего ключа завершается с ошибкой (sipp-litbang1. atribut_proposal, CONSTRAINT fkAtributProposal FOREIGN KEY (id_pengguna) ССЫЛКИ user (id) ON DELETE CASCADE ON UPDATE CASCADE) array (3) {[0] => строка (5) "00000" [1] => NULL [2] => NULL}

Я делаю способ вставки данных, например:

      public function pengajuan_proposal($pengguna, $judul_pro, $abstrak, $keywords, $lama_kegiatan, $bidang_fokus_id, $bidang_fokus_at, $topik_penelitian,
                                           $nidn, $nama_personil, $prodi, $jen_pend, $jab_fung, $danus1, $danus2, $danus3, $danin1, $danin2,
                                           $danin3){

            $this->conn->beginTransaction();
            try {


                $query = $this->conn->prepare("INSERT INTO identitas_proposal 
                                              (id_pengguna, judul_pro, abstrak, keywords, lama_kegiatan, bidang_fokus)
                                              VALUES (:id_pengguna, :judulpro, :abstrak, :keywords, :lamakegiatan, :bidangfokus)");
                $query->bindParam(':id_pengguna', $pengguna, PDO::PARAM_STR);
                $query->bindParam(':judulpro', $judul_pro, PDO::PARAM_STR);
                $query->bindParam(':abstrak', $abstrak, PDO::PARAM_STR);
                $query->bindParam(':keywords', $keywords, PDO::PARAM_STR);
                $query->bindParam(':lamakegiatan', $lama_kegiatan, PDO::PARAM_STR);
                $query->bindParam(':bidangfokus', $bidang_fokus_id, PDO::PARAM_STR);
                $query->execute();

                $lastInsertID = $this->conn->lastInsertId();

                $query = $this->conn->prepare("INSERT INTO atribut_proposal 
                                              (id_pengguna, bidang_fokusatribut, topik_penelitian)
                                              VALUES (:id_pengguna, :bidangfokusatribut, :topikpenelitian)");
                $query->bindParam(':id_pengguna', $lastInsertID, PDO::PARAM_STR);
                $query->bindParam(':bidangfokusatribut', $bidang_fokus_at, PDO::PARAM_STR);
                $query->bindParam(':topikpenelitian', $topik_penelitian, PDO::PARAM_STR);
                $query->execute();

                $query = $this->conn->prepare("INSERT INTO daftar_personil 
                                              (id_pengguna, nidn, nama_personil, program_studi, jenjang_pend, jabatan)
                                              VALUES (:id_pengguna, :nidn, :namapersonil, :programstudi, :jenjangpendidikan, :jabatan)");
                $query->bindParam(':id_pengguna', $lastInsertID, PDO::PARAM_STR);
                $query->bindParam(':nidn', $nidn, PDO::PARAM_STR);
                $query->bindParam(':namapersonil', $nama_personil, PDO::PARAM_STR);
                $query->bindParam(':programstudi', $prodi, PDO::PARAM_STR);
                $query->bindParam(':jenjangpendidikan', $jen_pend, PDO::PARAM_STR);
                $query->bindParam(':jabatan', $jab_fung, PDO::PARAM_STR);
                $query->execute();

                $query = $this->conn->prepare("INSERT INTO biaya_usulan 
                                              (id_pengguna, biaya_tahun1, biaya_tahun2, biaya_tahun3)
                                              VALUES (:id_pengguna, :biayatahun1, :biayatahun2, biayatahun3)");
                $query->bindParam(':id_pengguna', $lastInsertID, PDO::PARAM_STR);
                $query->bindParam(':biayatahun1', $danus1, PDO::PARAM_STR);
                $query->bindParam(':biayatahun2', $danus2, PDO::PARAM_STR);
                $query->bindParam(':biayatahun3', $danus3, PDO::PARAM_STR);
                $query->execute();

                $query = $this->conn->prepare("INSERT INTO biaya_internal 
                                              (id_pengguna, biaya_tahun1in, biaya_tahun2in, biaya_tahun3in)
                                              VALUES (:id_pengguna, :biayatahun1in, :biayatahun2in, biayatahun3in)");
                $query->bindParam(':id_pengguna', $lastInsertID, PDO::PARAM_STR);
                $query->bindParam(':biayatahun1in', $danin1, PDO::PARAM_STR);
                $query->bindParam(':biayatahun2in', $danin2, PDO::PARAM_STR);
                $query->bindParam(':biayatahun3in', $danin3, PDO::PARAM_STR);
                $query->execute();

                $this->conn->commit();
            }
            catch (PDOException $e){
                $this->conn->rollBack();
                echo $e->getMessage();
                var_dump($this->conn->errorInfo());
            }

            return true;
        }
    }

Затем, в файле pengajuan.php, я пишу такие коды:

<?php

    require_once __DIR__ . "/../class.proposal.php";

    $proposal = new PROPOSAL();
    if (isset($_POST['submit'])){
        $pengguna           = $_SESSION['userSession'];
        $judulpro           = $_POST['judulproposal'];
        $abstrak            = $_POST['abstrak'];
        $keywords           = $_POST['keywords'];
        $lama_kegiatan      = $_POST['lamakegiatan'];
        $bidang_fokus_id    = $_POST['bidangfokusid'];
        $bidang_fokus_at    = $_POST['bidangfokusat'];
        $topik_penelitian   = $_POST['topik'];
        $nidn               = $_POST['nidn'];
        $nama_personil      = $_POST['namapersonil'];
        $program_studi      = $_POST['programstudi'];
        $jenjang_pendidikan = $_POST['jenjangpendidikan'];
        $jabatan            = $_POST['jabatan'];
        $biaya_tahun1us     = $_POST['danus1'];
        $biaya_tahun2us     = $_POST['danus2'];
        $biaya_tahun3us     = $_POST['danus3'];
        $biaya_tahun1in     = $_POST['danin1'];
        $biaya_tahun2in     = $_POST['danin2'];
        $biaya_tahun3in     = $_POST['danin3'];


        try {
            if($proposal->pengajuan_proposal($pengguna, $judulpro, $abstrak, $keywords, $lama_kegiatan, $bidang_fokus_id, $bidang_fokus_at,
                $topik_penelitian, $nidn, $nama_personil, $program_studi, $jenjang_pendidikan,
                $jabatan, $biaya_tahun1us, $biaya_tahun2us, $biaya_tahun3us, $biaya_tahun1in,
                $biaya_tahun2in, $biaya_tahun3in)){


            }
        }
        catch (PDOException $e){
            echo $e->getMessage();
        }
    }
?>

Я попытался найти решения здесь и реализовал как удалить родительские таблицы (пользователь, в моем случае), и снова создать эту таблицу или изменить поле по умолчанию id_pengguna на null, но это не сработало. В чем проблема? Или, может быть, у моих кодов все еще есть ошибки или что-то еще. Извините за мой сломанный английский, кстати.

Теги:
pdo

1 ответ

1
Лучший ответ

@VTaehyung, вы сталкиваетесь с проблемой из-за ограничений внешнего ключа. либо "удалить ограничение внешнего ключа", либо убедиться, что значение столбца id_pengguna должно присутствовать в таблице пользователя в столбце id.

мы не можем добавить значение во внешнюю таблицу, если оно не присутствует в первичной таблице. например, мы не можем добавить сотрудника в департамент, которого еще нет.

Например, таблица Sales.SalesOrderHeader имеет ссылку внешнего ключа к таблице Sales.SalesPerson, так как существует логическая связь между заказами на продажу и продавцами. Столбец SalesPersonID таблицы SalesOrderHeader соответствует столбцу первичного ключа таблицы SalesPerson. Столбец SalesPersonID в таблице SalesOrderHeader является внешним ключом таблицы SalesPerson. Создав эту взаимосвязь внешнего ключа, значение SalesPersonID не может быть вставлено в таблицу SalesOrderHeader, если оно еще не существует в таблице SalesPerson.

ссылки: https://docs.microsoft.com/en-us/sql/relational-databases/tables/primary-and-foreign-key-constraints?view=sql-server-2017

  • 0
    Хорошо, спасибо за ваше объяснение. На самом деле у меня есть значение в поле id (pk) пользовательской таблицы, когда я отображаю его на pengajuan.php, оно имеет значение, равное 1. Как вы сказали, «мы не можем добавить значение во внешнюю таблицу, если оно присутствует в первичной таблице ', но мой первичный уже имеет значение. Интересно, что происходит? Как видно из моих кодов, я установил id_pengguna как $ _SESSION ['userSession'], поэтому я вставляю id_pengguna в зависимости от того, кто вошел в систему.
  • 0
    Думаю, ограничения внешнего ключа терпят неудачу на таблице atribut_proposal, в которой значение id_pengguna равно последнему вставленному id в iditas_proposal. вы можете изменить << $ query-> bindParam (': id_pengguna', $ lastInsertID, PDO :: PARAM_STR); >> на $ query-> bindParam (': id_pengguna', $ pengguna, PDO :: PARAM_STR);
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню