在一个查询中插入带ID的人员?

时间:2013-08-10 12:12:49

标签: mysql last-insert-id

我需要将数据添加到MySQL数据库中:

Person: pId, nameId, titleId, age

Name: nameId, name

Title: titleId, title

我不希望在数据库中有更多的名称或标题,所以我没有看到LAST_INSERT_ID()的解决方案

我的方法看起来像这样:

INSERT IGNORE INTO Name(name) VALUES ("Peter");
INSERT IGNORE INTO Title(title) VALUES ("Astronaut");
INSERT INTO Person(nameId, titleId, age) VALUES ((SELECT nameId FROM Name WHERE name = "Peter"), (SELECT nameId FROM Name WHERE name = "Astronaut"), 33);

但我猜这是一种非常肮脏的方法!? 如果可能的话,我想用一个查询添加多个人,而在db中没有任何超过一次。 这有可能以一种很好的方式吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您可以将标题和名称作为表格的两列,然后:

  • 如果您不想在数据库中使用两个标题或两个相同的名称,则在每列上设置一个UNIQUE索引
  • UNIQUE上设置(title,name)索引,如果您不希望两个条目同名相同标题。

如果确实希望拥有单独的表,您可以按照帖子中的建议进行操作,但将所有插入语句包装在TRANSACTION中,以便在检测到重复时允许回滚某处。

请参阅Design dilemma: If e-mail address already used, send e-mail "e-mail address already registered", but can't because can't add duplicate to table,这似乎是完全相同的问题,但有名称&电子邮件而不是名称&标题。

START TRANSACTION;
INSERT INTO title(value) VALUES ("Prof.");
SELECT LAST_INSERT_ID() INTO @title_id; 
    -- Instead of using user-defined variable, 
    -- you should be able to use the last_insert_id 
    -- equivalent from the host language MySQL driver.
INSERT INTO username(value) VALUES ("Sylvain");
SELECT LAST_INSERT_ID() INTO @username_id;
    -- Instead of using user-defined variable, 
    -- you should be able to use the last_insert_id 
    -- equivalent from the host language MySQL driver.

INSERT INTO account(username_id, email_id) VALUES (@username_id,@title_id); 
COMMIT;

请参阅LAST_INSERT_ID()


第三个解决方案是在SELECT之前插入以查看条目中已经存在。但就我个人而言,我至少不会推动 check-before-set 方法,如果你使用正确的索引,这将需要一个额外的查询,这大多是多余的。