MySQL でトリガーを使用して自動インクリメントの複合キーを定義するにはどうすればよいですか?

DDD
リリース: 2024-11-03 07:33:30
オリジナル
271 人が閲覧しました

How Can You Use Triggers to Define a Composite Key with Auto Increment in MySQL?

MySQL でトリガーを使用して自動インクリメントで複合キーを定義する

MySQL では、複数のカラムを含む複合キーを作成できますが、このようなキーの自動インクリメントを構成するのは、特に InnoDB テーブルの場合は注意が必要です。

シナリオ

2 つの外部キーと 1 つの自動インクリメント列を一部に持つテーブルを考えてみましょう。複合主キーの:

CREATE TABLE `issue_log` (
`sr_no` INT NOT NULL AUTO_INCREMENT,
`app_id` INT NOT NULL,
`test_id` INT NOT NULL,
`issue_name` VARCHAR(255) NOT NULL,
PRIMARY KEY (app_id, test_id, sr_no)
);
ログイン後にコピー

InnoDB での自動インクリメントの制限

InnoDB は、自動インクリメントを主キー内の単一の列に制限します。 sr_no を自動インクリメントおよび複合キーの一部として定義しようとすると、「テーブル定義が正しくありません。自動列は 1 つだけ存在でき、キーとして定義する必要があります。」というエラーが発生します。

解決策: トリガーの使用

このシナリオを実装するには、トリガーを使用して、各 INSERT 操作の前に sr_no の値を自動的に設定できます:

DELIMITER $$

CREATE TRIGGER xxx BEFORE INSERT ON issue_log
FOR EACH ROW BEGIN
    SET NEW.sr_no = (
        SELECT IFNULL(MAX(sr_no), 0) + 1
        FROM issue_log
        WHERE app_id = NEW.app_id
          AND test_id = NEW.test_id
    );
END $$

DELIMITER ;
ログイン後にコピー

このトリガーは、指定された app_id と test_id の既存の最大値を見つけて sr_no の新しい値を計算し、それを 1 ずつ増分します。トリガーを使用することで、sr_no が新しい行ごとに正しく設定されていることを確認できます。自動インクリメント列として直接定義されていません。

注: 特定のテーブル名とフィールド名に一致するようにテーブル構造とトリガー定義を調整してください。

以上がMySQL でトリガーを使用して自動インクリメントの複合キーを定義するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート