MySQL触发重复数据

MySQL触发重复数据,mysql,triggers,Mysql,Triggers,我有这样的疑问 CREATE TRIGGER `tambah_riwayatobat` AFTER INSERT ON `obat` FOR EACH ROW insert into riwayat_obat(nama, keterangan, distributor,tanggal) (select new.nama, 'Masuk', d.nama ,now() From distributor d join obat ON new.id_distributor = d.id_distrib

我有这样的疑问

CREATE TRIGGER `tambah_riwayatobat` AFTER INSERT ON `obat`
FOR EACH ROW insert into riwayat_obat(nama, keterangan, distributor,tanggal)
(select new.nama, 'Masuk', d.nama ,now()
From distributor d
join obat ON new.id_distributor = d.id_distributor)
我尝试使用触发器插入数据,并使用约束获取一个零件数据,但为什么数据是重复条目

输出:

例如,如果我第一次尝试插入数据obat,tambah_riwayatobat上的数据也会插入1

如果我第二次尝试插入数据obat,tambah_riwayatobat上的数据将使用相同的数据插入2次

如果我第三次尝试插入数据,tambah_riwayatobat上的数据会使用相同的数据插入3次,我不确定到底发生了什么,但这是触发器代码中的联接的结果。您正在将
obat
加入到
distributor
,但是您的加入条件没有提到
obat
,因此您得到了某种形式的交叉积,在第二次和后续的
INSERT
中,您的
SELECT
子查询选择了多行

您不应该(也不需要)使用联接,因为您需要的来自
obat
的所有数据都已经在伪记录
NEW
中。以下代码应该工作得更好:

CREATE TRIGGER `tambah_riwayatobat`
  AFTER INSERT ON `obat`
  FOR EACH ROW
    INSERT INTO riwayat_obat
        (nama, keterangan, distributor, tanggal)
      (SELECT NEW.nama, 'Masuk', d.nama, now()
        FROM distributor d
        WHERE new.id_distributor = d.id_distributor
        LIMIT 1);

LIMIT
子句将确保
SELECT
只选择一行,因此
INSERT
只插入一行;如果
distributor.id\u distributor
是主键,则不需要
LIMIT
子句。

(1)触发器所做的一切就是插入到另一个表中。它不会阻止任何插入。(2) 如果要防止重复,请使用唯一约束或索引。可以修复我的代码吗?