脚本/工作流程插入不存在并自动增加

时间:2015-08-26 19:07:11

标签: mysql

我从2系统创建脚本/工作流导出/导入。

我有Table1 {id,name,description}

  • 我想创建一个脚本(不是一个过程)。我可以(我没有成功)在我的工作流程中添加程序。 (最后创建和删除)
  • id是自动增量
  • 我无法更改表格
  • 我可以肯定,在我开始执行脚本和结束之间,我的一个项目不会插入到数据库中。

脚本插入{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上的多次插入。但是没有改变表格。

也许我做错了

  • 我试过IF,但没有在外面工作。
  • 我尝试了IGNORE(只有当id是相同的,但从不相同时才有效) 自动增量)
  • 我试过WHEN
  • 我试过ON DUPLICATE KEY

由于@ idTable1,我需要更改“set @ idTable1 = LAST_INSERT_ID();”如果我没有其他的话。但是如果我的项目是唯一一个具有相同“名称”的项目,我可以得到它而不是last_insert_id。

我选择在“BEGIN”之前创建程序,并在脚本末尾删除它们。

2 个答案:

答案 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 IGNOREINSERT ...ON DUPLICATE KEY UPDATE

答案 1 :(得分:0)

只需创建名称为主键的表,然后确保使用键大小写(大写或小写)以避免重复。

CREATE TABLE TABLE1(
   id INT AUTO_INCREMENT,
   name CHAR(30),
   description CHAR(100),
   PRIMARY KEY (name)
)