Saya memiliki pengaturan database sqlite sederhana dengan tabel yang disebut penampakan dan kolom di dalam tabel yang disebut nama. Saya dapat menjalankan kueri SELECT normal dan INSERT dan UPDATE baik-baik saja, tetapi ketika saya mencoba menjalankan DELETE, itu diawali dengan "baru." ke dalam kolom yang saya berikan dan kemudian mengatakan itu tidak ada:

sqlite> DELETE FROM sightings WHERE name = "blah";
Error: no such column: new.name
sqlite> DELETE FROM sightings WHERE names = "blah";
Error: no such column: names

Kolom itu disebut "nama" dan ketika saya memilih kolom itu, kolom itu menambahkan "baru." di depannya, tetapi ketika saya memilih kolom yang salah yang tidak ada ("nama" seperti di atas), itu hanya mengatakan itu tidak ada secara normal, tanpa "baru.". Bantuan apa pun dengan ini akan sangat dihargai.

-1
RandomUser 12 Desember 2019, 04:18

1 menjawab

Jawaban Terbaik

Tampaknya Anda memiliki PEMICU DELETE dan TRIGGER itu salah menggunakan new.name untuk mereferensikan kolom nama dari baris yang dihapus (untuk DELETE TRIGGER lama. digunakan untuk mereferensikan kolom dari baris yang dihapus).

Anda harus mengubah PEMICU untuk menggunakan old.name daripada new.name.

  • new.column hanya berlaku untuk pemicu INSERT atau UPDATE.

  • old.column hanya berlaku untuk pemicu DELETE atau UPDATE.

Sesuai :-

Baik klausa WHEN maupun tindakan pemicu dapat mengakses elemen baris yang disisipkan, dihapus, atau diperbarui menggunakan referensi formulir "NEW.column-name" dan "OLD.column-name", di mana nama kolom adalah nama dari kolom dari tabel yang terkait dengan pemicu. Referensi LAMA dan BARU hanya dapat digunakan dalam pemicu pada peristiwa yang relevan, sebagai berikut:

  • MASUKKAN referensi BARU adalah valid
  • UPDATE referensi BARU dan LAMA adalah sah
  • HAPUS referensi LAMA valid

SQL Seperti Dipahami Oleh SQLite - CREATE TRIGGER

Mungkin pertimbangkan contoh berikut: -

CREATE TABLE IF NOT EXISTS sightings (name TEXT);
CREATE TABLE IF NOT EXISTS deleted_sightings (name TEXT); /* Table to be populated by the trigger */
INSERT INTO sightings VALUES ('blah'),('notblah'),('anothernotblah');
/* Normal deletion without triggers */
DELETE FROM sightings WHERE name = 'blah';
SELECT * FROM sightings; /* RESULT 1 (sightings table after deletion)*/

/* Add the row that was deleted again */
INSERT INTO sightings VALUES('blah');

/* Add a valid AFTER DELETE TRIGGER referring to the old column */
/* The Trigger will add a row to the deleted_sightings table using the value from the deleted row */
CREATE TRIGGER IF NOT EXISTS correct_trigger 
    AFTER DELETE ON sightings 
    BEGIN INSERT INTO deleted_sightings 
        VALUES(old.name); 
    END;
DELETE FROM sightings WHERE name = 'blah';
SELECT * FROM sightings; /* RESULT 2 (sightings table after deletion)*/
SELECT * FROM deleted_sightings; /* RESULT 3  deleted_sightings table */

/* Add a Trigger that will try to add a row to the deleted_sightings table */
/* BUT will result in the new.name column not being found as there is no */
/* new. for a DELETE trigger only old. */
CREATE TRIGGER IF NOT EXISTS incorrect_trigger AFTER DELETE ON sightings BEGIN INSERT INTO deleted_sightings VALUES(new.name); END;
/* Show the triggers */
SELECT * FROM sqlite_master WHERE type = 'trigger'; /* RESULT 4 - The triggers as per sqlite_master */
DELETE FROM sightings WHERE name = 'blah'; /* <<<<< DELETE will fail due to incorrect trigger */

Hasilnya menjadi :-

enter image description here

enter image description here

enter image description here

enter image description here

Dan kesalahan karena pemicu yang salah: -

/* RESULT 4 - The triggers as per sqlite_master */
DELETE FROM sightings WHERE name = 'blah'
> no such column: new.name
> Time: 0s
2
MikeT 12 Desember 2019, 02:36