如果不存在,如何插入寄存器-触发mysql

时间:2018-11-08 17:52:10

标签: mysql

我有一个要插入的记录列表,但是我不想插入具有相同字段的重复项,我需要验证该记录是否存在并且不插入它,并继续分析以下内容

BEGIN
IF NOT EXISTS (SELECT * FROM Leads WHERE n_documento = new.n_documento AND programa = new.programa) THEN
    INSERT INTO Leads
    VALUES
    (NULL, new.nombres, new.apellidos, new.n_documento, new.fecha_de_nacimiento, new.telefono, new.email, new.ciudad, 
    new.pais, new.anos_de_experiencia, new.origen, new.informacion_adicional, new.fecha, new.programa, new.estado, new.fecha_charla,
    new.grado_de_estudio, new.empresa, new.cargo, null);
END IF;

我的触发器不起作用,它无法验证,并且允许输入重复项

2 个答案:

答案 0 :(得分:0)

在触发器中处理此问题不是处理此问题的最佳或最有效的地方。

您可以做的是建立复合唯一索引。然后,这又将不允许您插入第二行,其中所选列的值与另一行相同。

例如

ALTER TABLE `YourSchema`.`YourTableName` 
ADD UNIQUE INDEX `CompoundUniqueIndexName` (`Col1` ASC, `Col2` ASC, `Col3` ASC);

现在运行以下一次:

INSERT INTO `YourSchema`.`YourTableName` (`Col1`, `Col2`, `Col3`) VALUES ('Bob', 'Jim', 'Bill');

将成功添加一行。但是,您第二次运行它,将会收到以下错误,并且该行将不会插入:

  

错误代码:1062。密钥的条目“ Bob-Jim-Bill”重复   'CompoundUniqueIndexName'

注意事项

我发现您的复合索引中的每个值都必须有一个值。因此,重要的是将复合索引中涉及的每一列设置为NOT NULL。另外,如果您无法控制输入以确保存在某个值,则还可能需要提供一个默认值(例如“ 0”)或其他值。

原因不是我完全确定,但是我知道以下两个语句不会产生“ Duplicate Entry”错误,因为如果不采取上述预防措施,Col3将为NULL。

INSERT INTO `YourSchema`.`YourTableName` (`Col1`, `Col2`) VALUES ('Bob', 'Jim');

然后再

INSERT INTO `YourSchema`.`YourTableName` (`Col1`, `Col2`) VALUES ('Bob', 'Jim');

答案 1 :(得分:-1)

如果在查询中使用这种条件,则可能会提高性能。

从线索中选择第一名1 1