我需要将数据添加到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中没有任何超过一次。 这有可能以一种很好的方式吗?谢谢!
答案 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;
第三个解决方案是在SELECT
之前插入以查看条目中已经存在。但就我个人而言,我至少不会推动 check-before-set 方法,如果你使用正确的索引,这将需要一个额外的查询,这大多是多余的。