Как решить проблему с уникальным идентификатором PHP, ORACLE 12C - PullRequest
0 голосов
/ 26 марта 2020

Использование PHP + Oracle 12 c

Я пытаюсь вставить много строк, но у меня появляется ошибка "oci_execute(): ORA-00001: unique constraint (S95417.FIRMA__IDX)" Это странно для меня, потому что в l oop i ' Я получаю последний идентификатор и увеличиваю его.

Я использовал debbuger и (при вставке) я получаю последний идентификатор, но увеличение не работает. Не могли бы вы сказать мне, почему?

Данные, которые я добавил

INSERT INTO FIRMA VALUES(18,MICROSOFT,2432213715,2020-03-26,23)
INSERT INTO FIRMA VALUES(19,APPLE,7512202082,2020-03-26,42)





SELECT NVL(MAX(firmaid),0)+1

Я сделал код очень похожим, используя этот код для других таблиц, и он работает нормально.

Мой код:

  $ile_razy = $_POST['liczba_powtorzen'];

    $firma = "SELECT * FROM FIRMA";

    $c = oci_connect($username, $password, $database);
    if (!$c) {
        $m = oci_error();
        trigger_error('Could not connect to database: '. $m['message'], E_USER_ERROR);
    }

        $file = 'firma.txt';
        $current = file_get_contents($file);

    for ($i = 1; $i <= $ile_razy; $i++) {

        $nazwa = randCompanyName();
        $nip = randNIP();
        $dataWspolpracy = date("Y-m-d");

        $ids_array = array();

        $adresid = "SELECT adresid FROM ADRES";

        $stmtt = oci_parse($c, $adresid);

        $result = oci_execute($stmtt);

        while($row = oci_fetch_array($stmtt))
        {
            $ids_array[] = $row['ADRESID'];
        }
        $randIndex = array_rand($ids_array);
        $adresId = $ids_array[$randIndex];

    // HERE IS PROBLEM
        $firmaQuery = "INSERT INTO FIRMA SELECT NVL(MAX(firmaid),0) + 1,'$nazwa', '$nip', '$dataWspolpracy', '$adresId' from FIRMA";
        $ex = oci_parse($c,$firmaQuery);
// "zapytanie" is working fine
        $zapytanie = "SELECT NVL(MAX(firmaid),0)+1 from FIRMA";
        $stmt = oci_parse($c, $zapytanie);
        $results = oci_execute($stmt);
        while($row = oci_fetch_assoc($stmt)){
            $rowid  = $row["NVL(MAX(FIRMAID),0)+1"];  
        }
        $firmaIdForTxt = "INSERT INTO FIRMA VALUES(".$rowid.",".$nazwa.",".$nip.",".$dataWspolpracy.",".$adresId.")";
        echo $rowid. ", ";
        oci_execute($ex);
        $current .= $i. ".".$firmaIdForTxt."\n";
        file_put_contents($file, $current);
        }

enter image description here

В моем БД enter image description here

Я изменил это, но ошибка все еще появляется

enter image description here

1 Ответ

0 голосов
/ 26 марта 2020

Вы можете сделать свой FIRMAID столбец идентификации : Oracle будет обрабатывать приращение внутренне, и это будет намного безопаснее для ваших данных.

Затем вы можете вставить свой данные с этим запросом:

INSERT INTO FIRMA(nazwa, nip, datawspolpracy, adresid) VALUES('$nazwa', '$nip', '$dataWspolpracy', '$adresId')

ПРИМЕЧАНИЕ: это для быстрого ответа, для более безопасного решения и избежания SQL инъекций, используйте подготовленные операторы: PHP oci examples ( Смотрите пример № 2)

...