1

我发现自己试图通过其他人编写的程序来应对糟糕的数据库结构,并试图编写我的查询来应对这种情况。我正在尝试模拟一个没有已知唯一/主键的 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 UPDATEupsert 查询,但这不起作用,因为我们没有唯一键或主键可以在这里工作。

4

1 回答 1

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 UPDATEwhich 不仅在UPDATE存在重复主键的情况下执行该子句,而且在违反任何其他唯一键约束的情况下也使用该子句。另请参阅此处接受的答案的评论。

于 2012-10-08T09:21:46.130 回答