根据另一个插入的结果插入值
Posted
技术标签:
【中文标题】根据另一个插入的结果插入值【英文标题】:Inserting values based on results of another insert 【发布时间】:2013-11-14 07:23:09 【问题描述】:mysql数据库academy
和instructors
中有两张表。我想按以下顺序(伪代码)向每个表中插入值:
academy
值acad_name, address, street, city,
state
第二次插入instructors
值instructor_name
第三
插入academy
值instructor_id
来自instructors
\此记录应与相应的academy_id
第三次插入基于第二次插入instructor_id
的结果,即 auto_increment。但是我希望第三个插入对应于当前学院的值,之前插入的值我该怎么做?
CREATE TABLE IF NOT EXISTS `academy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
`academy_id` int(11) NOT NULL,
`instructor_id` int(11) DEFAULT NULL,
`street_address` varchar(50) NOT NULL,
`city` varchar(25) NOT NULL,
`state` varchar(25) NOT NULL,
PRIMARY KEY (`id`),
KEY `instructor_id` (`instructor_id`) // Foreign KEY
);
CREATE TABLE IF NOT EXISTS `instructors` (
`instructor_id` int(11) NOT NULL AUTO_INCREMENT,
`academy_id` int(11) NOT NULL
PRIMARY KEY (`instructor_id`),
KEY `academy_id` (`academy_id`) // Foreign KEY
);
【问题讨论】:
第三个实际上是更新插入第一个的条目?? 您的桌子设计有圆形 FK! academy_id 讲师中的外键,instructor_id 是学院表中的外键。 @Damodaran 原因是之前提出的另一个问题,*** 【参考方案1】:您的表结构有点混乱。当您有一个(我假设)唯一的“academy_id”字段时,为什么在表学院中有一个自动递增的“id”字段,使用“academy_id”作为主键。
表结构意味着一个多对多的关系,每个表对另一个表都有一个外键约束,假设在正常情况下,一个讲师只属于一个学院,但一个学院可以有多个讲师,您应该删除来自表学院的外键约束,然后从表中的外键约束中引用属于该学院的所有讲师。
如果场景暗示必须存在多对多关系,那么您必须创建一个交集实体。这意味着如果一个学院有很多讲师,而一个讲师可以有很多学院,那么您可以创建一个新表,其中包含来自表学院的两个外键约束,以及具有唯一 id 字段的讲师。
【讨论】:
【参考方案2】:您可以使用 insert id 函数检索学院表的 id 并添加到其他表中插入。
mysqli
mysqli_insert_id();
mysql
mysql_insert_id();
【讨论】:
【参考方案3】:首先将条目插入到学院表中,然后再插入到讲师表中。然后使用
mysql_insert_id
获取最后插入的 id 并更新学院表中的条目。 Check this question
【讨论】:
【参考方案4】:可以在每次插入后查询自增列的值, 例如
SELECT @insert_id:=`AUTO_INCREMENT`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'YourDatabaseName'
AND TABLE_NAME = 'YourTableName';
)
或
INSERT INTO `academy`(`id`) VALUES (NULL);
SET @last_insert_id = LAST_INSERT_ID();
将其设置为用户定义的变量,然后在连续插入时使用它。
但是,如果发生多个并行插入,您还必须使用锁定表才能使用正确的自动增量 ID 值。
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
【讨论】:
以上是关于根据另一个插入的结果插入值的主要内容,如果未能解决你的问题,请参考以下文章
Sql 从一个表列中选择一个最小值,并在一个 SQL 语句中将结果插入到另一个表列中
Oracle SQL:根据在另一个表中给定条件的列中找到的值插入