我发现自己试图应对一个糟糕的数据库结构,从其他人编写的程序,并试图编写我的查询来应对。 我试图模拟一个upsert查询,其中没有已知的唯一/主键...
DELIMITER //
IF ( ( SELECT COUNT( f_id ) FROM `wp_cformsdata` WHERE field_name='Agent First Name' AND sub_id='395' ) > 0 ) THEN
UPDATE `wp_cformsdata` SET field_val='Shane' WHERE field_name='Agent First Name' AND sub_id='395';
ELSE
INSERT INTO `wp_cformsdata` (sub_id, field_name, field_val) VALUES ( '395', 'Agent First Name', 'Shane' );
END IF;
DELIMITER ;
基本上我的表格布局如下......
+------+--------+------------+-----------+
| f_id | sub_id | field_name | field_val |
+------+--------+------------+-----------+
此表用于存储公司的各个数据。
'f_id'是此表中唯一的索引键(主键)。我们不知道它的价值,或者是否存在包含数据的任何密钥。
'sub_id'是另一个表的外键,每个公司的条目包含该外键。
'field_name'是公司信息的名称(例如公司名称)
'field_val'是该字段的实际值(例如Google Inc.)
我正在尝试更新这些表中的数据,或者插入数据不存在的位置。由于此表的性质,我无法在任何字段上创建索引。请参考上面的SQL来看看我在做什么 - 是的,它有点臃肿。如果您有更优化的解决方案,请告诉我们!
我尝试了INSERT ... ON DUPLICATE KEY UPDATE
upsert查询,但这不起作用,因为我们没有唯一的密钥或主键可以在这里解决。
答案 0 :(得分:1)
您实际上将(sub_id, field_name)
视为复合键。我假设f_id
是一个自动递增的列?如果是这样,您可以在(sub_id, field_name)
上定义唯一约束:
ALTER TABLE wp_cformsdata ADD UNIQUE mykey (sub_id, field_name)
然后使用INSERT ... ON DUPLICATE KEY UPDATE
,如果存在重复的主键,则不仅会执行UPDATE
子句,还会违反任何其他唯一键约束。另请参阅已接受答案的评论here。