在我们的生产数据库中,我们运行以下每小时运行的伪代码SQL批处理查询:
INSERT INTO TemporaryTable
(SELECT FROM HighlyContentiousTableInInnoDb
WHERE allKindsOfComplexConditions are true)
Run Code Online (Sandbox Code Playgroud)
现在这个查询本身并不需要很快,但我注意到它是锁定的HighlyContentiousTableInInnoDb,即使它只是从它读取.其他一些非常简单的查询需要大约25秒(这是其他查询需要多长时间).
然后我发现在这种情况下InnoDB表实际上是被SELECT锁定的!http://www.mysqlperformanceblog.com/2006/07/12/insert-into-select-performance-with-innodb-tables/
但我真的不喜欢选择OUTFILE的文章中的解决方案,它似乎是一个黑客(文件系统上的临时文件看起来很糟糕).还有其他想法吗?有没有办法制作InnoDB表的完整副本,而不会在复制过程中以这种方式锁定它.然后我可以将其复制HighlyContentiousTable到另一个表并在那里进行查询.
我正在尝试插入一个新行并使用max()+ 1设置customer_id.原因是该表已经在另一个名为id的列上具有auto_increatment,并且该表将具有多个具有相同customer_id的行.
有了这个:
INSERT INTO customers
( customer_id, firstname, surname )
VALUES
((SELECT MAX( customer_id ) FROM customers) +1, 'jim', 'sock')
Run Code Online (Sandbox Code Playgroud)
...我一直收到以下错误:
#1093 - You can't specify target table 'customers' for update in FROM clause
Run Code Online (Sandbox Code Playgroud)
另外,我如何阻止同时添加2个不同的客户而没有相同的customer_id?
我有一个带有DATETIME列的表.我想SELECT这个日期时间值并将其插入另一列.
我这样做了(注意:'2011-12-18 13:17:17'是前SELECT从DATETIME字段给我的值):
UPDATE products SET former_date=2011-12-18 13:17:17 WHERE id=1
Run Code Online (Sandbox Code Playgroud)
得到
1064 - You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near '13:17:17 WHERE itemid=1' at line 1
Run Code Online (Sandbox Code Playgroud)
好吧,我知道在那里放一个不带引号的字符串是错误的,但DATETIME首先只是一个字符串?我该放什么?我想要的只是可靠地将现有值转移到新的日期时间字段......
编辑:
我问的原因是:我有这个特殊的定义,DATETIME,并且在某种程度上我认为它在处理日期时给了我一些安全性和其他优点.现在它似乎只是一个专门的VARCHAR,可以这么说.
感谢您的回答,这似乎确实是预期的行为.
我正在做一个简单的插入Mongo ...
db.notes.insert({ title: "title", details: "note details"})
Run Code Online (Sandbox Code Playgroud)
插入便笺文档后,我需要立即获取对象ID.从插入返回的结果有一些关于连接和错误的基本信息,但没有文档和字段信息.
我发现了一些关于使用upsert = true的update()函数的信息,我只是不确定这是否是正确的方法,我还没有尝试过.
我正在将一堆新行插入到表中,该表定义如下:
CREATE TABLE [sometable](
[id] [int] IDENTITY(1,1) NOT NULL,
[someval] sometype NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
使用以下插入:
insert into sometable select somefield as someval from othertable
Run Code Online (Sandbox Code Playgroud)
当我完成后,我想知道所有新插入的行的ID.SCOPE_IDENTITY()仅返回插入的最后一行ID.
我怎样才能获得所有新ID?
一种让人想到的方法是从sometable和scope_identity()后插入中获取当前最大的标识,并使用这两个值从sometable中进行选择.例如:
declare @currentMaxId int;
select @currentMaxId=MAX(id) from sometable
insert into sometable select somefield as someval from othertable
select * from sometable where id>@currentMaxId and id<=SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)
有更好的模式吗?
如果我使用一个执行单个记录插入的循环插入多个记录,则返回的最后一个插入ID是预期的最后一个.但是,如果我执行多个记录插入语句:
INSERT INTO people (name,age)
VALUES ('William',25), ('Bart',15), ('Mary',12);
Run Code Online (Sandbox Code Playgroud)
假设上面三个是表中插入的第一个记录.在insert语句之后我期望最后一个插入id返回3,但它返回1.有问题的语句的第一个插入id.
那么有人可以确认这是否是LAST_INSERT_ID()多个记录INSERT语句的上下文中的正常行为.所以我可以将我的代码基于它.
使用MySQL 5.1.49,我正在尝试实现一个标记系统我遇到的问题是带有两列的表:id(autoincrement),tag(unique varchar) (InnoDB)
使用查询时,即使忽略插入INSERT IGNORE INTO tablename SET tag="whatever",自动增量id值也会增加.
通常这不会是一个问题,但我希望很多可能的尝试为这个特定的表插入重复项,这意味着我id的新行的字段的下一个值将跳得太多.
例如,我最终会得到一张表3行但不好id的表
1 | test
8 | testtext
678 | testtextt
Run Code Online (Sandbox Code Playgroud)
此外,如果我不这样做INSERT IGNORE并且只是定期INSERT INTO处理错误,则自动增量字段仍会增加,因此下一个真正的插入仍然是错误的自动增量.
如果有INSERT重复的行尝试,有没有办法停止自动增量?
正如我对MySQL 4.1的理解,这个值不会增加,但我想做的最后一件事是要么SELECT提前做很多语句来检查标签是否存在,或者更糟糕的是,降级我的MySQL版本.
在MySQL中,我想创建一个包含此查询中所有信息的新表:
select * into consultaa2 from SELECT
CONCAT( 'UPDATE customers SET
customers_default_address_id= ',
(SELECT a.address_book_id FROM
address_book a where
c.customers_id=a.customers_id order by
address_book_id desc limit 1), '
WHERE customers_id = ', customers_id,
';') AS sql_statement FROM customers c
where c.customers_id > 3894;
Run Code Online (Sandbox Code Playgroud)
查询太长,浏览器无法显示concat,我需要这个来进行更新.
我使用此命令将一些单词插入到两列表中:
INSERT IGNORE INTO terms (term) VALUES ('word1'), ('word2'), ('word3');
Run Code Online (Sandbox Code Playgroud)
如何获取插入每个单词的行的ID(主键).我的意思是在执行后返回类似"55,56,57"的值INSERT.MySQL有这样的回应吗?
专栏一词是UNIQUE.如果一个术语已经存在,MySQL将不会插入它.是否可以返回此复制的引用(即该术语存在的行的ID)?像"55,A响应12,56".
好吧,所以我一直在玩Steam Web API,我有一个值存储在一个名为的变量中$steam64.当我使用此代码片段将其插入到mysql数据库中时,它会插入一个完整的不同整数,而不是存储在变量中的整数.
$sql_query = "INSERT INTO users_info (steam64) VALUES ('$steam64')";
var_dump($steam64);返回真正的int,所以回显它.不太清楚这里发生了什么,任何帮助表示赞赏.
insert ×10
mysql ×8
sql ×5
innodb ×2
database ×1
datetime ×1
duplicates ×1
identity ×1
lastinsertid ×1
locking ×1
mongodb ×1
php ×1
pymongo ×1
select ×1
sql-server ×1
sql-update ×1