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以添加新行.
谢谢.
通过查询信息模式表并使用动态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)
| 归档时间: |
|
| 查看次数: |
5137 次 |
| 最近记录: |