2

CREATE TRIGGERという名前の MySQL テーブルで最初のコーディングを行っていますItem

新しい行を INTO テーブルに INSERT し、その値をテーブルに INSERT するためにitemindustrycodeslookupMax 値を取得したいと考えています。itemindustrycodeslookupIdItem

これが私がこれまでに持っているものです:

-- Trigger DDL Statements
DELIMITER $$

USE `nextcart`$$

CREATE TRIGGER `insert_itemindustrycodeslookupid` 
    BEFORE INSERT ON `item` FOR EACH ROW 
    BEGIN
        INSERT INTO `itemindustrycodeslookup` SET `itemindustrycodeslookupId` = NULL;
                    #SELECT here..
                    #INSERT here...
    END$$

その INSERT の後に別の INSERT が続く SELECT が必要ですか?

また、INSERT INTOitemindustrycodeslookup SETitemindustrycodeslookupIdについてもわかりません= NULL;。自動インクリメントである PK id を除いて、すべての列を null にすることができますSET= NULL

**コードの更新: 区切り文字が正しいかどうかはまだわかりません。まだ [適用] ボタンを押す準備ができていませんが、すぐに適用されます。

-- Trigger DDL Statements
DELIMITER $$

USE `nextcart`$$

CREATE TRIGGER `insert_itemindustrycodeslookupid` 
    AFTER INSERT ON `item` FOR EACH ROW 
    BEGIN
        DECLARE fk_id int;
        Set fk_id = LAST_INSERT_ID();
        INSERT INTO `itemindustrycodeslookup` SET `itemindustrycodeslookupId` = NULL;
        UPDATE `item` SET `item`.`itemindustrycodeslookupId` = LAST_INSERT_ID() WHERE `item`.`itemId` = fk_id;
    END$$

***最新のコード更新: これは機能し、Web からまとめて収集されました.. ポスターは「自己責任で使用する」と述べているため、より良い解決策があることを願っています。MySQL は、トリガーを起動した場合に独自のテーブルを更新することを好まないので... とにかく、DID の動作は次のとおりです。

-- Trigger DDL Statements
DELIMITER $$

USE `nextcart`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `nextcart`.`insert_itemindustrycodeslookupid`
BEFORE INSERT ON `nextcart`.`item`
FOR EACH ROW
BEGIN
    INSERT INTO nextcart.itemindustrycodeslookup SET itemindustrycodeslookupId = NULL;
    SET NEW.itemindustrycodeslookupId = (
        SELECT AUTO_INCREMENT - 1 
        FROM information_schema.TABLES 
        WHERE TABLE_SCHEMA = DATABASE() 
        AND TABLE_NAME = 'itemindustrycodeslookup'
      );
END$$

***解決策:これも機能することがわかりました。これは、以下の回答になる可能性があります..

-- Trigger DDL Statements
DELIMITER $$

USE `nextcart`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `nextcart`.`insert_itemindustrycodeslookupid`
BEFORE INSERT ON `nextcart`.`item`
FOR EACH ROW
BEGIN
    INSERT INTO nextcart.itemindustrycodeslookup SET itemindustrycodeslookupId = NULL;
    SET NEW.itemindustrycodeslookupId = (
        SELECT LAST_INSERT_ID());
END$$
4

1 に答える 1

2

挿入後に関数を呼び出してLAST_INSERT_ID()、挿入されたばかりの行の自動インクリメントID列の新しい値を取得します。すなわち:

 INSERT INTO `itemindustrycodeslookup` values (...);
 -- no need for a select
 INSERT INTO some_child_of_itemindustrycodeslookup values (..., LAST_INSERT_ID(), ...)

再度使用する必要がある場合は、子が挿入されると変更されるため、再利用のために保存する変数を宣言します。

DECLARE last_id int;

INSERT INTO parent ...
SET last_id = LAST_INSERT_ID();
INSERT INTO child .. -- #1
INSERT INTO child .. -- #2

挿入されるテーブルでトリガーが定義されている場合は、挿入後に起動するトリガーを定義する必要があります。

于 2012-12-23T22:49:25.400 に答える