我已经四处搜索,但没有找到是否可能.
我有这个MySQL查询:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
Run Code Online (Sandbox Code Playgroud)
字段ID具有"唯一索引",因此不能有两个.现在,如果数据库中已存在相同的ID,我想更新它.但是我真的必须再次指定所有这些字段,例如:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8
Run Code Online (Sandbox Code Playgroud)
要么:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g)
Run Code Online (Sandbox Code Playgroud)
我已经在插入中指定了所有内容......
一个额外的说明,我想使用工作来获取ID!
id=LAST_INSERT_ID(id)
Run Code Online (Sandbox Code Playgroud)
我希望有人能告诉我最有效的方法是什么.
我知道ON DUPLICATE KEY UPDATE如果已经存在该密钥的记录,您可以使用更新某个值,
我可以做这个:
INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3
Run Code Online (Sandbox Code Playgroud)
但是,如何在不必写出两次列和值的情况下执行此操作?
为了将大量数据加载到MySQL中,LOAD DATA INFILE是迄今为止最快的选择.不幸的是,虽然这可以以INSERT IGNORE或REPLACE的方式使用,但目前不支持ON DUPLICATE KEY UPDATE.
但是,ON DUPLICATE KEY UPDATE有优势REPLACE.当存在重复时,后者执行删除和插入.这为密钥管理带来了开销.此外,自动增量ID在替换时不会保持不变.
ON DUPLICATE KEY UPDATE使用LOAD DATA INFILE时如何模拟?
我有一个带有列的基本表:
如果唯一列不存在,则INSERT该行,否则更新行....
INSERT INTO pages (name, etc)
VALUES
'bob',
'randomness'
ON DUPLICATE KEY UPDATE
name = VALUES(name),
etc = VALUES(etc)
Run Code Online (Sandbox Code Playgroud)
问题是如果它执行UPDATE,id列上的auto_increment值会上升.因此,如果执行了大量UPDATES,则id auto_increment会通过屋顶.
显然这是一个错误:http://bugs.mysql.com/bug.php?id = 28871
...但我在mySQL 5.5.8上使用InnoDB共享主机.
其他几年前没有解决问题的人: 防止MYSQL重复插入时的自动增量以及 为什么MySQL自动增量会因失败的插入而增加?
关于修复的想法?我是否可能以某种方式错误地构建了数据库?
******编辑****:似乎在你的my.ini文件中添加innodb_autoinc_lock_mode = 0修复了问题,但我对共享主机有什么选择?
******编辑2******:好的,我认为我唯一的选择是改为MyISAM作为存储引擎.作为一个超级mySQL新手,我希望这不会导致很多问题.是吗?
如何INSERT用选项编写学说查询ON DUPLICATE KEY UPDATE?
我有几个类需要从一个包含Id的公共基类派生.暂时忽略除了其中一个之外的其他所有内容,让我们说:
public class MyBase {
[Key]
public int Id { get; set; }
}
public class MyName : MyBase {
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的上下文(DataContext)看起来像这样:
public DbSet<MyName>MyNames { get; set; }
// to avoid having EF make a MyBases table and instead map
// MyBase.Id into MyNames and my other derived classes I do this ...
protected override void OnModelCreating((DbModelBuilder modelBuilder) {
modelBuilder.Entity<MyBase>()
.Property(c => c.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity<MyName>()
.Map(m => {
m.MapInheritedProperties();
m.ToTable("MyNames");
});
}
Run Code Online (Sandbox Code Playgroud)
生成的数据库,当我启用迁移,添加迁移初始化和更新数据库时,我得不到名为MyBases的表,而是在MyNames中获取Id列 …
我想将PDO INSERT和UPDATE准备好的语句切换到INSERT和ON DUPLICATE KEY UPDATE,因为我认为它比我目前正在做的更有效率,但是我在找出正确的语法时遇到了麻烦.与命名占位符和bindParam一起使用.
我在SO上发现了几个类似的问题,但我是PDO的新手,无法根据我的标准成功调整代码.这是我尝试过的,但它不起作用(它不插入或更新):
try {
$stmt = $conn->prepare('INSERT INTO customer_info (user_id, fname, lname) VALUES(:user_id, :fname, :lname)'
'ON DUPLICATE KEY UPDATE customer_info SET fname= :fname,
lname= :lname
WHERE user_id = :user_id');
$stmt->bindParam(':user_id', $user_id);
$stmt->bindParam(':fname', $_POST['fname'], PDO::PARAM_STR);
$stmt->bindParam(':lname', $_POST['lname'], PDO::PARAM_STR);
$stmt->execute();
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码的简化版本(我有几个查询,每个查询有20-50个字段).我当前正在更新并检查更新的行数是否大于0,如果没有则运行Insert,并且每个查询都有自己的bindParam语句集.
php pdo prepared-statement sqlbindparameter on-duplicate-key
我明白存在INSERT IGNORE和INSERT ... ON DUPLICATE KEY UPDATE.但是,当存在重复键时,我想对INSERT临时表执行操作以保留已违反的唯一键的记录,以便我可以将其输出给用户.
有什么方法可以ON DUPLICATE INSERT吗?如果它有帮助,我正在尝试进行批量插入.
我正在开发一个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) 我真正想要的是在JOOQ中编写以下查询:
stmt = connection.prepareStatement(
"INSERT INTO `tbl` (`name`, `service_id`, `device_id`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`)",
Statement.RETURN_GENERATED_KEYS
);
Run Code Online (Sandbox Code Playgroud)
我无法在JOOQ中找到一种方法.可能吗?
on-duplicate-key ×10
mysql ×8
insert ×2
pdo ×2
php ×2
sql ×2
c# ×1
code-first ×1
doctrine ×1
java ×1
jooq ×1
yii ×1
yii-cmodel ×1