MySQL テーブルの最初の列には、自動インクリメント ID が含まれています。新しい行をテーブルに挿入するときに、この値を別の列に入力したいと思います。つまり、ID 列の値を読み取って、次の列に挿入する必要があります。
これを行うことは可能ですか?
MySQL テーブルの最初の列には、自動インクリメント ID が含まれています。新しい行をテーブルに挿入するときに、この値を別の列に入力したいと思います。つまり、ID 列の値を読み取って、次の列に挿入する必要があります。
これを行うことは可能ですか?
これは機能するはずです:
INSERT INTO table(id, same_id, col1)
(
SELECT NULL AS id,
(SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA=DATABASE() AND
TABLE_NAME='table') AS same_id,
"value" AS col1
);
編集:それが指摘するJonathan Swartz
ように、競合状態に苦しんでいます。これを修正するLAST_INSERT_ID()
には、最後に挿入されたIDを取得し、新しい列でこの値を更新します。
INSERT INTO table(id, same_id, col1)
(
SELECT NULL AS id,
NULL AS same_id,
"value" AS col1
);
SELECT LAST_INSERT_ID() INTO @var_id;
UPDATE table
SET same_id = @var_id
WHERE id = @var_id;
上記の回答のいくつかはうまくいくと確信していますが、それらを実装する方法を見つけることができませんでした。ただし、を使用してソリューションを正常に実装しました$pdo->lastInsertId()
。つまり、追加した INSERT クエリを実行した後:
$new_id = $pdo->lastInsertId();
$sth2 = $pdo->prepare("UPDATE `tracks` SET `fav_id`= IF(`fav_id`=0,$new_id,fav_id) WHERE `id`=$new_id");
$sth2->execute();
fav_id がまだ設定されていない場合は、最後に挿入された行の fav_id 列が、この行の id 列と同じ値に設定されます。
キーの有無にかかわらず、2 番目の列も (一致する AUTOINCREMENT 初期値で) 自動インクリメントすることができます。
この上で使用するmysqli_insert_id
場合は使用できますPHP
。
例。
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE myCity LIKE City");
$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);
printf ("New Record has id %d.\n", $mysqli->insert_id);
/* drop table */
$mysqli->query("DROP TABLE myCity");
/* close connection */
$mysqli->close();
?>
このmysqli_insert_id()
関数は、AUTO_INCREMENT 属性を持つ列を持つテーブルに対するクエリによって生成された ID を返します。最後のクエリが INSERT または UPDATE ステートメントではない場合、または変更されたテーブルに AUTO_INCREMENT 属性を持つ列がない場合、この関数はゼロを返します。