我有一个表格来编辑记录(标本)。在表单上是一个多选列表,其中包含表(主题)中的记录。此选择列表显示样本中存在的主题(如sample_topic查找表中所示)以及可添加到样本中的主题(来自主题表)。
我希望能够将未在列表中选择的主题添加到查找表中,其中samples_fk尚不存在topic_fk:
CREATE TABLE IF NOT EXISTS `specimen_topic_lookup` (
`specimen_topic_lookup_pk` int(6) NOT NULL AUTO_INCREMENT,
`specimen_fk` int(6) NOT NULL,
`topic_fk` int(3) NOT NULL,
PRIMARY KEY (`specimen_topic_lookup_pk`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci AUTO_INCREMENT=8 ;
我有什么想法可以做到这一点吗?
更新
我已将字段sample_fk和topic_fk设为UNIQUE。使用下面的代码,在samples_table查找中只创建一条记录,当应该创建两条记录时(在创建字段UNIQUE之前,创建两条记录OK ...)。我认为这是因为$specimen_pk
对于每个插入都是相同的值。
foreach($topics as $topic){
$query_topics = "INSERT IGNORE INTO specimen_topic_lookup(specimen_fk, topic_fk)
VALUES ('$specimen_pk', '$topic')";
$result_topics = mysql_query($query_topics, $connection) or die(mysql_error());
}
看起来UNIQUE正在停止使用相同的值创建记录(这至少是我的预期......)
这项工作
无需制作samples_fk或topic_fk UNIQUE ......
foreach($topics as $topic){
$query_topics = "INSERT INTO specimen_topic_lookup(specimen_fk, topic_fk)
SELECT '$specimen_pk', '$topic'
FROM DUAL
WHERE NOT EXISTS (SELECT 1
FROM specimen_topic_lookup
WHERE specimen_fk = '$specimen_pk' AND topic_fk = '$topic')";
$result_topics = mysql_query($query_topics, $connection) or die(mysql_error());
答案 0 :(得分:2)
在表格上创建一个唯一索引并使用insert ignore
或on duplicate key update
:
create unique index specimen_topic_lookup(specimen_fk, topic_fk);
insert ignore into specimen_topic_lookup(specimen_fk, topic_fk)
select $speciment_fk, $topic_fk;
或者,您可以在没有唯一索引的情况下执行以下操作:
insert into specimen_topic_lookup(specifmen_fk, topic_fk)
select $speciment_fk, $topic_fk
from dual
where not exists (select 1
from specimen_topic_lookup
where specimen_fk = $specimen_fk and topic_fk = $topic_fk
);
答案 1 :(得分:0)
使用INSERT IGNORE
声明。这将插入任何不违反唯一键的行,并忽略那些行。