MySQL の自動増分値に 1 つのステートメント内でアクセスできますか? 質問する

MySQL の自動増分値に 1 つのステートメント内でアクセスできますか? 質問する

ユーザーのテーブルを含む MySQL データベースがあります。テーブルの主キーは「userid」で、自動増分フィールドとして設定されています。

私がやりたいのは、テーブルに新しいユーザーを挿入するときに、自動増分によって「userid」フィールドに作成されるのと同じ値を、別のフィールド「default_assignment」で使用することです。

例えば

次のような声明を希望します:

INSERT INTO users ('username','default_assignment') VALUES ('barry', value_of_auto_increment_field())

そこで、ユーザー「Barry」を作成すると、「userid」は (たとえば) 16 として生成されますが、「default_assignment」にも同じ値 16 を持たせたいと考えています。

これを実現する方法はありますか?

ありがとう!

アップデート:

ご返信ありがとうございます。default_assignment フィールドは冗長ではありません。default_assigment は、ユーザー テーブル内の任意のユーザーを参照できます。ユーザーを作成するときに、default_assignment として別のユーザーを選択できるフォームが既にありますが、同じユーザーに設定する必要がある場合があります。そのため、質問しました。

アップデート:

わかりました。更新トリガーの提案を試してみましたが、まだうまくいきません。私が作成したトリガーは次のとおりです。

CREATE TRIGGER default_assignment_self BEFORE INSERT ON `users`  
FOR EACH ROW BEGIN
SET NEW.default_assignment = NEW.userid;
END;

ただし、新しいユーザーを挿入する場合、default_assignment は常に 0 に設定されます。

ユーザー ID を手動で設定すると、default_assignment はユーザー ID に設定されます。

したがって、自動割り当て生成プロセスは、トリガーが有効になった後に実行されます。

ベストアンサー1

別のテーブルを作成する必要はありません。max() はテーブルの auto_increment 値に応じて問題が発生するため、次のようにします。

CREATE TRIGGER trigger_name BEFORE INSERT ON tbl FOR EACH ROW
BEGIN
   DECLARE next_id;
   SET next_id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tbl');
   SET NEW.field = next_id;
END

next_id 変数は通常は他の方法で使用されるため(*)、そのまま new.field=(select ...) と実行することもできます。

CREATE TRIGGER trigger_name BEFORE INSERT ON tbl FOR EACH ROW
BEGIN
   SET NEW.field=(SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tbl');
END

また、(SELECT 文字列フィールド) の場合には、CAST 値を使用できます。

CREATE TRIGGER trigger_name BEFORE INSERT ON tbl FOR EACH ROW
BEGIN
   SET NEW.field=CAST((SELECT aStringField FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tbl') AS UNSIGNED);
END

(*) 画像に自動的に名前を付けるには:

SET NEW.field = CONCAT('image_', next_id, '.gif');

(*) ハッシュを作成するには:

SET NEW.field = CONCAT( MD5( next_id ) , MD5( FLOOR( RAND( ) *10000000 ) ) );

おすすめ記事