0

我需要像这样将数据添加到 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 中没有任何超过一次。这可能以一种很好的方式吗?谢谢!

4

1 回答 1

0

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

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

如果您真的想要单独的表,您可以按照您在帖子中的建议进行操作,但是TRANSACTION如果您在某处检测到重复,请将所有插入语句包装在 a 中以允许回滚。

请参阅设计困境:如果电子邮件地址已使用,则发送电子邮件“电子邮件地址已注册”,但不能因为无法将重复项添加到表中,这似乎是完全相同的问题,但具有名称 &电子邮件而不是姓名和头衔。

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方法,这将需要一个额外的查询,如果您使用正确的索引,这将是多余的。

于 2013-08-10T12:20:39.863 回答