我正在开发一个Yii项目.在Yii模型上执行save()时,如何使用MySQL的ON DUPLICATE功能(http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html)?
我的MySQL如下:
CREATE TABLE `ck_space_calendar_cache` (
`space_id` int(11) NOT NULL,
`day` date NOT NULL,
`available` tinyint(1) unsigned NOT NULL DEFAULT '0',
`price` decimal(12,2) DEFAULT NULL,
`offer` varchar(45) DEFAULT NULL,
`presale_date` date DEFAULT NULL,
`presale_price` decimal(12,2) DEFAULT NULL,
`value_x` int(11) DEFAULT NULL,
`value_y` int(11) DEFAULT NULL,
PRIMARY KEY (`space_id`,`day`),
KEY `space` (`space_id`),
CONSTRAINT `space` FOREIGN KEY (`space_id`) REFERENCES `ck_space` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
我的PHP是如下:
$cache = new SpaceCalendarCache();
$cache->attributes = …Run Code Online (Sandbox Code Playgroud) 我做了一些研究,但似乎没有什么能满足我的需求.我有一个数据库表,其中包含从Web服务中恢复的一些数据.
用户为每个记录执行一些任务,然后将其标记为"已处理".所以我有一个额外的db字段(不是基于我从WS得到的数据),名为"processed",默认设置为0,当用户完成工作时为1.
每天我检查WS,如果状态代码更改我想更新行并设置回处理为0(因此用户可以再次处理它).
让我们说这是我的数据库......
+------+------------+-------+------------+
| id | statuscode | foo | processed |
+------+------------+-------+------------+
| 123 | 66 | bar | 1 |
+------+------------+-------+------------+
Run Code Online (Sandbox Code Playgroud)
我认为ON DUPLICATE KEY UPDATE有一些条件可以使它工作,也许有一些CASE或IF条件......我错了吗?任何建议都很好,谢谢!
我有一个声明尝试插入记录,如果它已经存在,它只是更新记录.
INSERT INTO temptable (col1,col2,col3)
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3);
Run Code Online (Sandbox Code Playgroud)
完整语句有多个插入,我希望根据UPDATE计算INSERT数.我可以用MySQL变量做这个,我还没有找到一种方法来搜索后这样做.
我有一个像下面这样的查询
INSERT INTO connections (`c_id`,`in`,`out`,`ip`,`userID`)
VALUES (
(
SELECT c_id
FROM connections
WHERE (a bunch of conditions)
ORDER BY c_id DESC LIMIT 1
),
'1373799802',
0,
INET_ATON('127.0.0.1'),
4
)
ON DUPLICATE KEY UPDATE `out` = 1
Run Code Online (Sandbox Code Playgroud)
这会引发以下错误
1093 - 您无法在FROM子句中为更新指定目标表"连接"
显然我在insert into on duplicate update语法中不能有SELECT子句,但我真的宁愿这样做,而不是运行2个查询.谁能告诉我怎么做到这一点?
我正在尝试在MySQL数据库和SQL Server 2008 R2之间编写桥梁来同步表中的值.我陷入SQL Server数据库的多插入值.通常在MySQL中我使用如下查询:
INSERT INTO table (column1, column2)
VALUES(value1, value2), (value3, value4)
ON DUPLICATE KEY UPDATE column2 = VALUES(value2);
Run Code Online (Sandbox Code Playgroud)
有没有办法如何多次插入SQL Server MERGE?
谢谢你的回答
sql-server sql-server-2008-r2 multiple-insert on-duplicate-key
我目前具有包括一次关键问题ID被设置为auto increment.它不断增加ON DUPLICATE KEY.
例如:
ID | field1 | field2
1 | user | value
5 | secondUser | value
86 | thirdUser | value
Run Code Online (Sandbox Code Playgroud)
从上面的描述中,您会注意到我在该表中有3个输入但由于每次更新时自动递增,因此第三个输入的ID为86.
反正有没有避免这个?
这是我的mySQL查询的样子:
INSERT INTO table ( field1, field2 ) VALUES (:value1, :value2)
ON DUPLICATE KEY
UPDATE field1 = :value1, field2 = :value2
Run Code Online (Sandbox Code Playgroud)
这就是我的桌子的样子;
CREATE TABLE IF NOT EXISTS `table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`field1` varchar(200) NOT NULL,
`field2` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY …Run Code Online (Sandbox Code Playgroud) 您能否建议是否有任何方法可以通过添加前缀或后缀来保留所有可重复(重复)的键。在下面的示例中,地址键重复 3 次。它可能会有所不同(1 到 3 次)。我想获得预期输出中的输出,并添加后缀以使密钥唯一。目前更新功能正在覆盖键值。
list = ['name:John','age:25','Address:Chicago','Address:Phoenix','Address:Washington','email:John@email.com']
dic = {}
for i in list:
j=i.split(':')
dic.update({j[0]:j[1]})
print(dic)
Run Code Online (Sandbox Code Playgroud)
当前输出:{'name':'John','age':'25','Address':'Washington','email':'John@email.com'}
预期输出:{'name':'John','age':'25','Address1':'芝加哥','Address2':'Phoenix','Address3':'华盛顿','email':'John @email.com'}
尝试了以下方法:
list = ['name:John','age:25','Address:Chicago','Address:Phoenix','Address:Washington','email:John@email.com']
dic = {}
for i in list:
j=i.split(':')
dic.update({j[0]:j[1]})
print(dic)
Run Code Online (Sandbox Code Playgroud)
预期输出:{'name':'John','age':'25','Address1':'芝加哥','Address2':'Phoenix','Address3':'华盛顿','email':'John @email.com'}
我正在努力迁移数据库,我不知道为什么我会收到此错误.有谁知道如何解决这一问题?在此之前,我使用mysql创建了一个新数据库,并授予了用户访问权限.之前我有一个工作数据库,但应用程序无法正常工作(将OSX升级到El Capitan),所以我重新编写了它.我不确定我是否正确创建了新数据库.
> (env)DNab4046b2:VisualGenomeDev gmaister$ python manage.py migrate
> /Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/test/_doctest.py:59:
> RemovedInDjango18Warning: The django.test._doctest module is
> deprecated; use the doctest module from the Python standard library
> instead. RemovedInDjango18Warning)
>
> /Users/gmaister/Desktop/VisualGenomeDev/env/lib/python2.7/site-packages/django/test/simple.py:27:
> RemovedInDjango18Warning: The django.test.simple module and
> DjangoTestSuiteRunner are deprecated; use
> django.test.runner.DiscoverRunner instead. RemovedInDjango18Warning)
>
> Operations to perform: Synchronize unmigrated apps: lockdown,
> django_extensions, corsheaders, rest_framework Apply all migrations:
> hits, sessions, V6W, djcelery, contenttypes, auth, sites, admin,
> DataAnalysis, RegionAnnotations, common, UserManagement, Sentences,
> …Run Code Online (Sandbox Code Playgroud) 实际上,键必须在JSON对象中是唯一的(例如,JSON语法是否允许对象中的重复键?).但是,假设我有一个包含以下内容的文件:
{
"a" : "1",
"b" : "2",
"a" : "3"
}
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法将重复键转换为数组?这样文件就变成了:
{
"a" : [ {"key": "1"}, {"key": "3"}],
"b" : "2"
}
Run Code Online (Sandbox Code Playgroud)
或类似的东西,但它将重复的键组合成一个数组(或查找和替代方法来提取重复的键值).
这是Java中的解决方案:将带有重复键的JSON对象转换为JSON数组
有没有办法用awk/bash/python做到这一点?
我从这个来源读到,您可以在postgres中的dupcliate键ignore上进行插入,但是我似乎无法从以下选择中使用它:
我已经看到您可以做的是:
insert into tab(id, val) values(1, 'nosert'), (2,
'nosert'), (3, 'nosert') on duplicate key ignore returning id;
Run Code Online (Sandbox Code Playgroud)
我为什么不能做这样的事情?
insert into table_one (field_one, field_two) select field_one, field_two from table_two on duplicate key ignore returning field_one;
Run Code Online (Sandbox Code Playgroud)
有人告诉我在重复项附近存在语法错误,但是在此之前的查询运行良好(尽管它在重复的索引上冲突),其余的查询只是添加on duplicate key ignore returning field_one。
这不可能select from吗?
on-duplicate-key ×10
mysql ×6
php ×2
conditional ×1
dictionary ×1
django ×1
duplicates ×1
function ×1
jq ×1
json ×1
key ×1
postgresql ×1
python ×1
select ×1
sql ×1
sql-server ×1
yii ×1
yii-cmodel ×1