Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重复密钥更新时MySQL插入新行_Mysql_Sql - Fatal编程技术网

重复密钥更新时MySQL插入新行

重复密钥更新时MySQL插入新行,mysql,sql,Mysql,Sql,我正在尝试向MySQL表插入新行,除非campign\u id列中存在具有相同值的行,在这种情况下,我希望更新该行。 我的问题是: INSERT INTO prv_campaigns SET website_id = %s,account_id = %s,campaign_id = %s,campaign_name = %s,start_date = %s, end_date = %s,targeting_type = %s,enabled = %s,status = %s,bid_type

我正在尝试向MySQL表插入新行,除非
campign\u id
列中存在具有相同值的行,在这种情况下,我希望更新该行。 我的问题是:

INSERT INTO prv_campaigns SET 
website_id = %s,account_id = %s,campaign_id = %s,campaign_name = %s,start_date = %s,
end_date = %s,targeting_type = %s,enabled = %s,status = %s,bid_type = %s,
default_bid = %s,min_bid = %s,max_bid = %s,budget = %s,cost = %s,ctr = %s,
utm_codes = %s,country_codes = %s,country_targeting = %s,opt = %s,
device_targeting = %s,language_targeting = %s,exclude_low_volume = %s
ON DUPLICATE KEY UPDATE
campaign_name = %s,
start_date = %s,
end_date = %s,
targeting_type = %s,
enabled = %s,
status = %s,
bid_type = %s,
default_bid = %s,
min_bid = %s,
max_bid = %s,
budget = %s,
cost = %s,
ctr = %s,
utm_codes = %s,
country_codes = %s,
country_targeting = %s,
opt = %s,
device_targeting = %s,
language_targeting = %s,
exclude_low_volume 
表结构如下:

CREATE TABLE `prv_campaigns` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `creation_date` datetime DEFAULT CURRENT_TIMESTAMP,
  `modification_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `website_id` int(11) DEFAULT '0',
  `account_id` int(11) DEFAULT NULL,
  `campaign_id` varchar(100) NOT NULL,
  `campaign_name` varchar(256) NOT NULL,
  `start_date` varchar(45) DEFAULT NULL,
  `end_date` varchar(45) DEFAULT NULL,
  `targeting_type` varchar(45) DEFAULT NULL,
  `enabled` varchar(45) DEFAULT NULL,
  `status` varchar(45) DEFAULT NULL,
  `bid_type` varchar(45) DEFAULT NULL,
  `default_bid` varchar(45) DEFAULT NULL,
  `min_bid` varchar(45) DEFAULT NULL,
  `max_bid` varchar(45) DEFAULT NULL,
  `budget` varchar(45) DEFAULT NULL,
  `cost` varchar(45) DEFAULT NULL,
  `ctr` varchar(45) DEFAULT NULL,
  `utm_codes` varchar(256) DEFAULT NULL,
  `country_codes` json DEFAULT NULL,
  `country_targeting` varchar(45) DEFAULT NULL,
  `opt` varchar(45) DEFAULT NULL,
  `device_targeting` json DEFAULT NULL,
  `language_targeting` json DEFAULT NULL,
  `exclude_low_volume` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ndx` (`website_id`,`account_id`,`campaign_id`,`campaign_name`)
) ENGINE=InnoDB AUTO_INCREMENT=14334 DEFAULT CHARSET=utf8$$

现在,我显然错误地认为,既然
campaign\u id
是一个唯一的键,那么查询的更新部分就会发生,但是会在我的数据库中创建一个新行……你知道如何解决这个问题吗?thx

活动id不是唯一的密钥。它是由四部分组成的唯一键的一个元素。这四种组合是独一无二的。不是每一个都是单独的

如果希望它是唯一的,那么将其声明为:
unique(campaign\u id)
。您可能还希望其他字段“单独”唯一

如果愿意,可以将此约束添加到表中:

alter table prv_campaigns  add constraint unq_campaigns_campaign_id
    unique (campaign_id);

假设我无法更改表,那么在提供的查询中是否有一个解决方案可以实现?@yarivbar。不是真的。如果
campaign\u id
应是唯一的,则应将其声明为唯一的。