PHP MySQL在同一个表中复制一行...使用Primary和Unique键

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)

不漂亮,不快.但是有效.


Mar*_*ark 5

感谢 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)