我从2系统创建脚本/工作流导出/导入。
我有Table1 {id,name,description}
脚本插入{name,description}但是如果元素(名称或名称和描述)存在,我想不插入。
BASE QUERY:
INSERT INTO TABLE1 (name,description) VALUES ('itemX','this is item X')
BASE脚本:
Use database1;
BEGIN;
SELECT * FROM TABLE1 ;
SELECT * FROM TABLE3 ;
INSERT INTO TABLE1 (name,description) VALUES ('itemX','this is item X');
set @idTable1 = LAST_INSERT_ID();
INSERT INTO TABLE3 (idTable1,idTable2) VALUES (@idTable1,1);
INSERT INTO TABLE3 (idTable1,idTable2) VALUES (@idTable1,2);
SELECT * FROM TABLE1 ;
SELECT * FROM TABLE3 ;
ROLLBACK;
我想保护TABLE1上的多次插入。但是没有改变表格。
也许我做错了
由于@ idTable1,我需要更改“set @ idTable1 = LAST_INSERT_ID();”如果我没有其他的话。但是如果我的项目是唯一一个具有相同“名称”的项目,我可以得到它而不是last_insert_id。
我选择在“BEGIN”之前创建程序,并在脚本末尾删除它们。
答案 0 :(得分:0)
如果可能,在name
字段上创建唯一约束。
否则,在插入之前创建触发器以忽略重复插入。
触发检查两个字段a和b上的重复:
delimiter //
drop trigger if exists aborting_trigger //
create trigger aborting_trigger before insert on t
for each row
begin
set @found := false;
select true into @found from t where a=new.a and b=new.b;
if @found then
signal sqlstate '45000' set message_text = 'duplicate insert';
end if;
end //
delimiter ;
此处的触发器提供类似于唯一约束的功能。创建后,您应该使用INSERT IGNORE
或INSERT ...ON DUPLICATE KEY UPDATE
答案 1 :(得分:0)
只需创建名称为主键的表,然后确保使用键大小写(大写或小写)以避免重复。
CREATE TABLE TABLE1(
id INT AUTO_INCREMENT,
name CHAR(30),
description CHAR(100),
PRIMARY KEY (name)
)