【发布时间】:2011-07-20 11:11:02
【问题描述】:
我有一个使用SELECT 语句插入的查询:
INSERT INTO courses (name, location, gid)
SELECT name, location, gid
FROM courses
WHERE cid = $cid
是否可以只为插入选择“名称、位置”,并将gid 设置为查询中的其他内容?
【问题讨论】:
标签: mysql sql insert-select
我有一个使用SELECT 语句插入的查询:
INSERT INTO courses (name, location, gid)
SELECT name, location, gid
FROM courses
WHERE cid = $cid
是否可以只为插入选择“名称、位置”,并将gid 设置为查询中的其他内容?
【问题讨论】:
标签: mysql sql insert-select
我们都知道这是可行的。
INSERT INTO `TableName`(`col-1`,`col-2`)
SELECT `col-1`,`col-2`
============================
在多个“选择”语句的情况下可以使用以下方法。仅供参考。
INSERT INTO `TableName`(`col-1`,`col-2`)
select 1,2 union all
select 1,2 union all
select 1,2 ;
【讨论】:
当然可以。
有一点需要注意:INSERT INTO SELECT 语句从一个表中复制数据并将其插入到另一个表中并要求源表和目标表中的数据类型匹配。如果来自给定表列的数据类型不匹配(即尝试将VARCHAR 插入INT,或将TINYINT 插入INT),MySQL 服务器将抛出SQL Error (1366)。
所以要小心。
这里是命令的语法:
INSERT INTO table2 (column1, column2, column3)
SELECT column1, column2, column3 FROM table1
WHERE condition;
旁注:有一种方法可以通过在您的SELECT 中使用casting 来规避不同的列类型插入问题,例如:
SELECT CAST('qwerty' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;
这种转换(CAST() 是 CONVERT() 的同义词)非常有用,如果您的表在同一表列上具有不同的字符集(如果处理不当可能会导致数据丢失)。
【讨论】:
查询的正确语法是:
INSERT INTO courses (name, location, gid)
SELECT (name, location, gid)
FROM courses
WHERE cid = $cid
【讨论】:
当然,您想为 gid 使用什么?一个静态值,PHP var,...
静态值 1234 可能类似于:
INSERT INTO courses (name, location, gid)
SELECT name, location, 1234
FROM courses
WHERE cid = $cid
【讨论】:
正确的语法:选择拼写错误
INSERT INTO courses (name, location, gid)
SELECT name, location, 'whatever you want'
FROM courses
WHERE cid = $ci
【讨论】:
是的,是的。你可以写:
INSERT INTO courses (name, location, gid)
SELECT name, location, 'whatever you want'
FROM courses
WHERE cid = $ci
或者您可以从 select 的另一个连接中获取值...
【讨论】:
我认为您的 INSERT 语句是错误的,请参阅正确的语法:http://dev.mysql.com/doc/refman/5.1/en/insert.html
编辑: 正如安德鲁已经指出的那样......
【讨论】:
是的,绝对是,但请检查您的语法。
INSERT INTO courses (name, location, gid)
SELECT name, location, 1
FROM courses
WHERE cid = 2
您可以在其位置放置一个与gid 相同类型的常量,当然不仅仅是1。而且,我只是编造了cid 的值。
【讨论】:
OUTPUT clause,它允许您将插入的任何内容也放入另一个表中。我认为 MySQL 没有等价物。您可以create a temporary table,选择该表,然后从该表中填充courses,然后将临时表用于您需要的任何其他内容。