我有一个语法问题,试图 UPDATE
如果2 non key
字段匹配。- INSERT
如果不匹配。
让我先说我有一个工作查询,涉及 SELECT
带着一个 ON DUPLICATE KEY UPDATE
. 现在我只是好奇,能不能换个方式?
出于纯粹的好奇,我尝试这种方式,将不需要 primary key
. 这真的只是一个实验,看看是否可以做到。
我想要的是 ON DUPLICATE KEY UPDATE
--但是:
让我们假装我不知道 key
,和
让我们假装我拿不到钥匙 SELECT
以下是我的数据结构:
+--------------------------------------------------------------------------+
| id | contractor_id | email_type_id | email_address |
+--------------------------------------------------------------------------+
表创建:
CREATE TABLE `email_list` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`contractor_id` int(11) NOT NULL,
`email_type_id` int(11) NOT NULL,
`email_address` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
现在我要做的是,如果没有select和on-duplicate键更新 contractor_id
和 email_type_id
匹配- UPDATE
这个 email_address
--其他 INSERT
.
如果你试过这个--(我知道我打破了我自己的规则没有选择):
IF EXISTS (SELECT * FROM email_list WHERE contractor_id = 1166)
UPDATE email_list SET (email_address='herky_jerky@snailmail.com')
WHERE contractor_id = 1166 AND email_type_id = 4
ELSE
INSERT INTO email_list VALUES (
contractor_id = 1166,
email_type_id = 4,
email_address = 'herky_jerky@snailmail.com');
我明白为什么这样不行。。我只是不知道该怎么解决这个问题——使用一个 IF - ELSE
声明。我也不想用 SELECT
--所以我想用一个 IF
比如:
UPDATE email_list SET email_address = 'herky@jerky.com'
WHERE contractor_id = 1166 AND email_type_id = 4
IF @@ROWCOUNT=0
INSERT INTO email_list VALUES (
contractor_id = 1166,
email_type_id = 4,
email_address = 'herky@jerky.com');
但我不明白为什么那个不行。这只是一个练习,看看这种类型的查询有多有创意。我认为我的两个想法都是可行的——有人能为这两个查询找到一个解决方案来让它工作吗?
我也希望看到其他更具创造性的方法来尝试我所要求的!
1条答案
按热度按时间voj3qocg1#
我会用一个
UPDATE
接着是测试ROW_COUNT()
如果没有更新行,那么INSERT
.你可以在这里看到它的作用:https://rextester.com/frfte79537
这里的想法是你做
UPDATE
首先,接着是INSERT ... SELECT
在哪里SELECT
仅返回一行,如果ROW_COUNT() = 0
是真的,只有当UPDATE
不匹配任何行。