【问题标题】:INSERT with SELECT用 SELECT 插入
【发布时间】: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


    【解决方案1】:

    我们都知道这是可行的。

    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 ;
    

    【讨论】:

      【解决方案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() 的同义词)非常有用,如果您的表在同一表列上具有不同的字符集(如果处理不当可能会导致数据丢失)。

      【讨论】:

        【解决方案3】:

        查询的正确语法是:

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

        【讨论】:

          【解决方案4】:

          当然,您想为 gid 使用什么?一个静态值,PHP var,...

          静态值 1234 可能类似于:

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              【解决方案6】:

              是的,是的。你可以写:

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

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

              【讨论】:

              • INSERT INTO 课程名称、位置、gid SELECT 名称、位置、'$this->gid' FROM courses WHERE cid = $cid -- 我收到错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'name, location, gid SELECT name, location, '22' FROM course WHERE cid = 23' 附近使用正确的语法
              • 我猜你的 gid 字段是一个整数,所以:'22' 必须是 22。将 '$this->gid' 更改为 $this->gid
              • 22 和 '22' 应该与 sql 无关,但我放了一个字符串以防该字段类似于唯一标识符。
              【解决方案7】:

              我认为您的 INSERT 语句是错误的,请参阅正确的语法:http://dev.mysql.com/doc/refman/5.1/en/insert.html

              编辑: 正如安德鲁已经指出的那样......

              【讨论】:

                【解决方案8】:

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

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

                您可以在其位置放置一个与gid 相同类型的常量,当然不仅仅是1。而且,我只是编造了cid 的值。

                【讨论】:

                • 工作,非常感谢。使用插入选择,字段名称不需要括号。但是当您开始在选择顶部指定值时,显然您需要 () 围绕字段名称。
                • 请注意,您不能在插入子句中使用别名:“INSERT INTO course t1 (t1.name, t1.location, t1.gid) [...] 将失败。
                • @Andrew 有没有什么方法可以在下次不运行 select 的情况下返回相同的选择?如果我想插入并获得课程表的结果
                • @TAHASULTANTEMURI 不同的问题。但是,如果我理解您的要求,SQL Server(不是被要求的,而是我这些天使用的)具有OUTPUT clause,它允许您将插入的任何内容也放入另一个表中。我认为 MySQL 没有等价物。您可以create a temporary table,选择该表,然后从该表中填充courses,然后将临时表用于您需要的任何其他内容。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-03-05
                • 2023-03-22
                相关资源
                最近更新 更多