Saya perlu menyalin bidang id dari satu kolom ke kolom lain ketika catatan baru dibuat. Nomor harus sama di kedua kolom dan dalam kasus terbaik itu harus dimasukkan pada saat yang sama ke dalam database. Solusi terbaik yang saya temukan mungkin menggunakan pemicu.

Saya membuat sql seperti ini:

TRIGGER `db`.`copy_id_into_mbc_id` BEFORE INSERT ON `my_table` FOR EACH ROW
BEGIN
SET NEW.mbc_id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES where TABLE_SCHEMA='mbc' and TABLE_NAME='my_table');
END

Solusi ini tampaknya berfungsi tetapi saya perlu tahu apakah itu aman. Saya membaca beberapa topik lama karena beberapa orang mengatakan itu dapat menyebabkan kondisi balapan. Saya tidak yakin dalam hal mana ini berisiko karena dari pengujian saya tampaknya baik-baik saja.

Apakah ada cara yang lebih baik untuk memastikan bahwa kedua kolom memiliki nilai yang sama persis ketika dimasukkan? Bidang id bertambah secara otomatis dan dalam kode saya tidak mengetahuinya sampai catatan dibuat tetapi memperbarui bidang kedua saat ini terlambat bagi saya.

Jadi pertanyaan saya adalah: Dengan nilai pemicu ini di kedua kolom akan selalu sama ketika catatan baru dibuat? Apakah ada cara yang lebih baik untuk menjaga kedua nilai tetap sama di mysql 5.5 atau di doktrin/php ?

0
patryno 20 November 2020, 16:20

1 menjawab

Jawaban Terbaik
CREATE TABLE test (id INT AUTO_INCREMENT PRIMARY KEY, val INT);
CREATE TRIGGER tr
BEFORE INSERT 
ON test 
FOR EACH ROW
SET NEW.val = ( SELECT AUTO_INCREMENT 
                FROM information_schema.TABLES 
                WHERE TABLE_SCHEMA=DATABASE()
                  AND TABLE_NAME='test' );
INSERT INTO test (id)
SELECT NULL UNION ALL SELECT NULL;

SELECT * FROM test;
id | val
-: | --:
 1 |   1
 2 |   1

db<>fiddle di sini


CREATE TABLE test (id INT AUTO_INCREMENT PRIMARY KEY, val INT);
CREATE TRIGGER tr
BEFORE INSERT 
ON test 
FOR EACH ROW
SET NEW.val = ( SELECT AUTO_INCREMENT 
                FROM information_schema.TABLES 
                WHERE TABLE_SCHEMA=DATABASE()
                  AND TABLE_NAME='test' );
CREATE PROCEDURE fill ()
BEGIN
    DECLARE cnt INT DEFAULT 0;
    WHILE cnt < 2 DO
        INSERT INTO test (id) VALUES (NULL);
        SET cnt := cnt + 1;
    END WHILE;
END;;
CALL fill();
SELECT * FROM test;
id | val
-: | --:
 1 |   1
 2 |   1

db<>fiddle di sini

1
Akina 20 November 2020, 14:24