用SELECT插入


287

我有一个查询,使用选择插入:

INSERT INTO courses (name, location, gid) 
            SELECT name, location, gid 
              FROM courses 
             WHERE cid = $cid

是否可以仅为插入内容选择“名称,位置”,并将gid设置为查询中的其他内容?

Answers:


547

是的,绝对可以,但是请检查您的语法。

INSERT INTO courses (name, location, gid)
SELECT name, location, 1
FROM   courses
WHERE  cid = 2

您可以放置gid与其位置相同类型的常量,而不只是1。而且,我只是弥补了cid价值。


2
工作,非常感谢。使用“插入选择”,字段名称周围不需要括号。但是,当您开始在选择顶部指定值时,显然您需要在字段名称周围加上()。
凯尔

请注意,您不能在INSERT子句中使用别名:“INSERT INTO课程T1(t1.name,t1.location,t1.gid)[...]将失败。
拉斐尔

@Andrew有什么方法可以返回相同的选择,而无需下次运行select?如果我想插入并获取课程表的结果
TAHA SULTAN TEMURI,

1
@TAHASULTANTEMURI不同的问题。但是,如果我理解您的要求,SQL Server(不是询问的内容,而是我最近使用的内容)具有OUTPUT子句,它可使您将插入的任何内容也放入另一个表中。我不认为MySQL具有等效功能。您可以创建一个临时表,选择该表,然后courses从该表填充,然后将temp表用于您需要的其他任何内容。
安德鲁(Andrew)

31

是的。你可以写 :

INSERT INTO courses (name, location, gid) 
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci

或者您可以从select ...的另一个联接中获取值


在课程中插入INSERT INTO课程名称,位置,gid SELECT名称,位置,'$ this-> gid'cid = $ cid-我得到了错误:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在“名称,位置,gid SELECT名称,位置,'22'FROM course WHERE cid = 23'”附近使用第1行
Kyle

我猜您的gid字段是一个整数,因此:“ 22”必须为22。将“ $ this-> gid”更改为$ this-> gid
Alex Reche Martinez

22和'22'对sql无关紧要,但是我放置了一个字符串以防该字段类似于唯一标识符。
Dumitrescu Bogdan

8

正确的语法:选择拼写错误

INSERT INTO courses (name, location, gid)
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci 

5

当然,您要使用什么作为伴娘?一个静态值,PHP var,...

静态值1234可能像这样:

INSERT INTO courses (name, location, gid)
SELECT name, location, 1234
FROM courses
WHERE cid = $cid


1

当然可以。

但是,应注意一件事:该INSERT INTO SELECT语句从一个表中复制数据并将其插入到另一个表中,并且要求源表和目标表中的数据类型匹配。如果从给定表列中的数据类型不匹配(即试图插入VARCHARINT,或TINYINT进入INT)MySQL服务器将抛出SQL Error (1366)

所以要小心

这是命令的语法:

INSERT INTO table2 (column1, column2, column3)
SELECT column1, column2, column3 FROM table1
WHERE condition;

旁注:有一种方法可以通过在您的中使用强制转换来避免不同的列类型插入问题SELECT,例如:

SELECT CAST('qwerty' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

如果您的表在同一表列上具有不同的字符集(如果处理不当,则有可能导致数据丢失),这种转换(CAST()是的同义词CONVERT())非常有用。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.