MySQL问题 - 试图应对糟糕的数据库结构

时间:2012-10-08 04:23:05

标签: mysql mysql-5.0

我发现自己试图应对一个糟糕的数据库结构,从其他人编写的程序,并试图编写我的查询来应对。 我试图模拟一个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查询,但这不起作用,因为我们没有唯一的密钥或主键可以在这里解决。

1 个答案:

答案 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