在同一个表中复制行并在MySQL中只更新一列

sha*_*esh 2 mysql copy row primary-key duplicates

我需要根据某些条件(where子句)复制一行,从表中,在同一个表中创建一个重复的条目,并只更新一列(foreign_key).但是因为"select*from Table_name"返回包括primary_key在内的所有字段,所以无法插入新行错误:重复键.

我不知道表的所有列,所以我不能通过在select查询中只提供必需的列名来忽略primary_key.

是否有任何方法可以忽略primary_key来获取自身..或者我可以获取整行,并将primary_key值设置为null,然后在表中插入行,以便自动增加primary_key以添加新行.

谢谢.

Mik*_*ike 5

通过查询信息模式表并使用动态SQL构建适当的语句,可以执行您想要的操作.但是,您应该非常小心这种方法,因为修改表中您不知道列名的数据可能会导致各种问题:

DROP TABLE mytable;

CREATE TABLE `mytable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col1` varchar(255) DEFAULT NULL,
  `col2` varchar(255) DEFAULT NULL,
  `col3` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO mytable (col1, col2, col3) VALUES ('A', 'B', 'C');

SELECT * FROM mytable;

+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
|  1 | A    | B    | C    |
+----+------+------+------+

SET @columns := (
  SELECT
    GROUP_CONCAT(column_name)
    FROM information_schema.columns
    WHERE table_schema = 'test'
    AND table_name = 'mytable'
    AND column_key <> 'PRI'
);

SET @sql := (
  SELECT CONCAT(
    'INSERT INTO mytable (', @columns, ') ',
    'SELECT ', @columns, ' FROM mytable ',
    'WHERE id = 1;'
  )
);

SELECT @sql;

+---------------------------------------------------------------------------------------+
| @sql                                                                                  |
+---------------------------------------------------------------------------------------+
| INSERT INTO mytable (col1,col2,col3) SELECT col1,col2,col3 FROM mytable WHERE id = 1; |
+---------------------------------------------------------------------------------------+

PREPARE stmt FROM @sql;

EXECUTE stmt;

SELECT * FROM mytable;

+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
|  1 | A    | B    | C    |
|  2 | A    | B    | C    |
+----+------+------+------+
Run Code Online (Sandbox Code Playgroud)