Nor*_*rse 20 php mysql row duplicates
我的表有两个键,一个是自动递增id(PRIMARY),另一个是项的名称(UNIQUE).
是否可以在同一个表中复制一行?我试过了:
INSERT INTO items
SELECT * FROM items WHERE id = '9198'
Run Code Online (Sandbox Code Playgroud)
这给出了错误 Duplicate entry '9198' for key 'PRIMARY'
我也尝试过:
INSERT INTO items
SELECT * FROM items WHERE id = '9198'
ON DUPLICATE KEY UPDATE id=id+1
Run Code Online (Sandbox Code Playgroud)
这给出了错误 Column 'id' in field list is ambiguous
就项目名称(UNIQUE)字段而言,有没有办法附加(Copy)到项目名称,因为此字段也必须是唯一的?
Mar*_*ers 45
明确选择所有列,但id列除外:
INSERT INTO items
(col1, col2, ..., coln)
SELECT col1, col2, ..., coln
FROM items
WHERE id = '9198'
Run Code Online (Sandbox Code Playgroud)
你的下一个问题可能是:
有没有办法在不明确列出所有列的情况下执行此操作?
答:不,我不这么认为.
Phi*_*ius 24
如果您真的不想列出Mark的答案中的所有表格列,您可以尝试这样做:
CREATE TEMPORARY TABLE temp_tbl SELECT * FROM items WHERE id = '9198';
SELECT @maxId := MAX(id) + 1 FROM items;
UPDATE temp_tbl SET id = @maxId;
INSERT INTO items SELECT * FROM temp_tbl;
DROP TABLE temp_tbl;
Run Code Online (Sandbox Code Playgroud)
不漂亮,不快.但是有效.
感谢 hobailey 提供了出色的免维护解决方案。
这是我最终使用的代码,它针对 MySQLi 进行了更新:
// Get the columns
$cols = array();
$result = $mysqli->query("SHOW COLUMNS FROM [TABLE]"); // Change table name
while ($r = $result->fetch_array(MYSQLI_ASSOC)) {
if (!in_array($r["Field"], array("COLA", "COL4", "COL8"))) { // Edit array with any column names you want to exclude
$cols[] = $r["Field"];
}
}
// Build and do the insert
$result = $mysqli->query("SELECT * FROM [TABLE] WHERE [SELECTION CRITERIA];"); // Change table name and add selection criteria
while ($r = $result->fetch_array(MYSQLI_ASSOC)) {
$insertSQL = "INSERT INTO [TABLE] (" . implode(", ",$cols) . ") VALUES ("; // Change table name
$count = count($cols);
foreach($cols as $counter=>$col) {
// This is where you can add any code to change the value of existing columns
$insertSQL .= "'" . $mysqli->real_escape_string($r[$col]) . "'";
if ($counter < ($count - 1)) {
$insertSQL .= ", ";
}
} // END foreach
$insertSQL .= ");";
$mysqli->query($insertSQL);
if ($mysqli->affected_rows < 1) {
// Add code if the insert fails
} else {
// Add code if the insert is successful
}
} // END while
Run Code Online (Sandbox Code Playgroud)