主キーの auto_increment ID 列を持つテーブルがあります。ID 100 など、ID が最も高い行を削除する場合、mysql トリガーのみを使用して、新しい行にその ID 100 を使用したいと考えています。それ、どうやったら出来るの?
たとえば、ID 1 を削除し、最大 ID が 100 の場合、ID 1 を再度使用したくありません。
異なる PHP 呼び出しで削除ステートメントと挿入ステートメントを実行します。
AUTO_INCREMENT テーブル オプションを設定する必要があります。
DELETE FROM table_name WHERE id = 100;
ALTER TABLE table_name AUTO_INCREMENT = 100;
...次に、新しいレコードを挿入します。
INSERT INTO table_name (id) VALUES (NULL); --> will add 100
auto_increment
を使用して値を変更してみましたalter table
。以来、挿入時に毎回チェックすると、パフォーマンスの問題が発生する可能性があります。ですから、削除が終わったらトリガーをかけるほうがいいと思いました。
Alter table
これを試してみたところ、トリガーには適用できないという結論に達しました。そして"Alter table"
、変更することだけを行うことauto_increment
は、この方法での解決策であるため、このアプローチを採用することはできません。
MySQLは「トリガーで明示的/暗黙的コミットは許可されていません」というエラーを出します。
ストアドプロシージャを作成し、テーブルから削除するときはいつでもそれを呼び出すことをお勧めします。私はあなたがあなたがどこを削除しているのかを常に知っていると思います(それで実行可能のようです)。
手順は次のとおりです。
DELIMITER $$
USE `database_name`$$
DROP PROCEDURE IF EXISTS `new_max`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `new_max`()
BEGIN
DECLARE i INTEGER;
SET i = (SELECT MAX(id) FROM `table_name`);
SET @ddl = CONCAT('alter table `table_name` auto_increment = ',(i+1));
PREPARE STMT FROM @ddl;
EXECUTE STMT;
END$$
DELIMITER ;
そして、あなたはそれを次のように呼ぶでしょうcall new_max();
ストアドプロシージャを使用すると、プログラミングの多くを行う必要はありません。削除コマンドが実行された後、コードに単純な行を追加するだけで、希望どおりに機能します。それが役に立てば幸い....
トリガーは次のとおりです(drop / createステートメントを使用):
DELIMITER $$
DROP TRIGGER IF EXISTS `trigger_name`$$
CREATE
TRIGGER `trigger_name` BEFORE INSERT ON `table_name`
FOR EACH ROW BEGIN
DECLARE inc_val INT;
SET inc_val := (SELECT IFNULL(MAX(ID), 0)+1 FROM table_name)
;
SET NEW.ID = inc_val
;
END;
$$
DELIMITER ;
最後に、私の問題に対する適切な解決策を見つけました。あなたのすべての提案と批判に感謝します。トリガーを使用する代わりに、プロシージャを使用するようになりました (アイデア @shubhansh に感謝します)。
これは、プロシージャの create ステートメントです。
DELIMITER $$
USE `[DATABASE]`$$
DROP PROCEDURE IF EXISTS `[PROCEDURE NAME]`$$
CREATE PROCEDURE `[PROCEDURE NAME]`(deleteID INT(11))
BEGIN
DECLARE i INTEGER;
SET @deleteRow = CONCAT('delete from `[TABLE NAME]` WHERE ID = ', deleteID);
PREPARE a FROM @deleteRow;
EXECUTE a;
SET i = (SELECT IFNULL(MAX(ID), 0) FROM `[TABLE NAME]`);
SET @alterTable = CONCAT('alter table `[TABLE NAME]` auto_increment = ',(i+1));
PREPARE b FROM @alterTable;
EXECUTE b;
END$$
DELIMITER ;
これで、1 つの PHP ステートメントで 1 つのテーブルを削除および変更できるようになりました。プロシージャがテーブルをロックするため、保存されます。