5

挿入時に自動生成される自動インクリメントされた「ID」主キーフィールドの値を別のフィールド「Sort_Placement」に割り当てるトリガーを作成して、挿入後も同じになるようにしようとしています。

なぜ私がこれを行っているのか疑問に思っているなら、「Sort_Placement」は変更可能なテーブルのソート値として使用されますが、デフォルトではレコードはテーブルの一番下に追加されます

表データ

`ID` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`Account_Num` mediumint(8) unsigned NOT NULL,
`Product_Num` mediumint(8) unsigned NOT NULL,
`Sort_Placement` mediumint(8) unsigned DEFAULT NULL,
`Order_Qty_C` smallint(6) NOT NULL DEFAULT '0',
`Order_Qty_B` smallint(6) NOT NULL DEFAULT '0',
`Discount` decimal(6,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`ID`),
UNIQUE KEY `ID_UNIQUE` (`ID`)

トリガー挿入後

CREATE 
TRIGGER `order_guide_insert_trigger`
AFTER INSERT ON `order_guide`
FOR EACH ROW
    BEGIN
    IF Sort_Placement IS NULL THEN
        SET Sort_Placement = NEW.ID;
    END IF;
END;

「NEW」プレフィックスを使用する組み合わせをたくさん試しましたが、うまくいきませんでした。たとえば、各フィールド名の前に NEW プレフィックスを付けます。

試してみる

INSERT INTO `order_guide` (`Account_Num`, `Product_Num`) VALUES ('5966', '3');

挿入エラー

ERROR 1054: Unknown column 'Sort_Placement' in 'field list'
4

2 に答える 2

0

テーブルのフィールド値が新しいレコードの自動インクリメント ID に基づく必要があるという、同様の (まだ異なる) 要件に遭遇しました。私のために働いた2つの解決策を見つけました。

最初のオプションは、60 秒ごとに実行されるイベント タイマーを使用することでした。イベントにより、フィールドがデフォルトの null に設定されているレコードが更新されました。最大 60 秒の遅延を気にしないのであれば、悪い解決策ではありません (更新されるフィールドがインデックス化されている場合は、1 秒ごとに実行できます)。基本的に、イベントはこれを行います:

CREATE EVENT `evt_fixerupper`
ON SCHEDULE EVERY 1 MINUTE
ENABLE
COMMENT ''  DO
BEGIN
  UPDATE table_a SET table_a.other_field=CONCAT(table_a.id,'-kittens')
  WHERE ISNULL(table_a.other_field);
END;

もう 1 つのオプションは、(AUTOINCREMENT に依存するのではなく) 独自の一意のプライマリ ID を生成することでした。この場合、perl モジュールhttps://metacpan.org/pod/Data::Uniqidをモデルにした関数を (アプリケーションで) 使用しました。生成された ID は非常に長いですが、うまく機能し、挿入する前に値を知っているので、それを使用して追加のフィールドの値を生成できます。

于 2015-02-15T09:30:40.493 に答える