刚刚遇到一个奇怪的问题,根据我创建索引的方式,需要一个索引名称。
http://dev.mysql.com/doc/refman/5.5/en/create-index.html
http://dev.mysql.com/doc/refman/5.5/en/alter-table.html
CREATE INDEX `random_name` ON `my_table` (`my_column`); # Requires an index name
ALTER TABLE `my_table` ADD INDEX (`my_column`); # Does not require an index name
Run Code Online (Sandbox Code Playgroud)
在我看来, CREATE INDEX 调用不应该要求索引名称。我想知道这是 MySQL 主义还是 SQL 标准?
在我粗略的研究过程中,我无法找到有关SELECT INTO OUTFILE超过INSERT INTO ... SELECT. 在阅读与InnoDB 表上的相关锁相关的文档时,INSERT INTO ... SELECT它指出:
在插入到 T 的每一行上设置一个没有间隙锁的排他索引记录。 如果事务隔离级别为 READ COMMITTED 或启用了 innodb_locks_unsafe_for_binlog,并且事务隔离级别不是 SERIALIZABLE,则 InnoDB 将 S 上的搜索作为一致读(不锁)。否则,InnoDB 会在来自 S 的行上设置共享的 next-key 锁。
为了避免锁定INSERT INTO ... SELECT似乎我必须确保隔离级别是READ COMMITTED为了避免在查询过程中锁定源表。
但是,我无法找到任何有关锁和使用的权威答案SELECT INTO OUTFILE,甚至没有找到MySQL文档参考锁信息。
我的目标是避免在查询运行时锁定源表以避免连接堆叠。
是否可以发出多个选择查询,其结果集通过联合合并到同一个输出文件中?
我正在尝试做但不起作用:
(SELECT email FROM table WHERE createdate >= date_sub(now(), interval 1 year))
UNION DISTINCT
(SELECT email FROM table WHERE createdate < date_sub(now(), interval 1 year) AND email not like '%@gmail.com')
INTO OUTFILE '/tmp/emailDump.txt' FIELDS TERMINATED BY "," LINES TERMINATED BY "\n";
Run Code Online (Sandbox Code Playgroud) 我遇到了一个相当复杂的查询问题,我需要将一个表中的 id(基于重标准)存储到一个狭窄的备用表中以供将来参考,但我一直遇到错误的 sql 构造错误。
如果我自己运行以下查询,它可以正常工作:
(SELECT DISTINCT a.id FROM accounts AS a
WHERE a.createdate >= date_sub(now(), INTERVAL 1 YEAR)
AND a.email NOT LIKE '%gmail.com')
UNION DISTINCT
(SELECT DISTINCT a.id FROM accounts AS a
WHERE a.createdate < date_sub(now(), INTERVAL 1 YEAR)
AND a.email NOT LIKE '%yahoo.com') AND a.email NOT IN
(SELECT email FROM inactive_clients));
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试像这样运行相同的查询:
INSERT INTO my_backup_table (account_id) VALUES ($aboveQuery);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
MySQL server version for the right syntax to use near 'UNION DISTINCT (SELECT DISTINCT a.id FROM accounts at line …Run Code Online (Sandbox Code Playgroud)