是否有可能在数据库触发器中使用多个 Before 或 After 语句
Is there a possibility to use multiple Before or After statements in Database trigger
每当 child table 更新时,我都会尝试更新 parent tables。当只有一个 child table.
时,我可以创建一个触发器
我有一个用例,其中我有多个 child table,我需要更新 parent table 当任何一个 tables 已更新。是否可以在触发器中添加多个 Before 或 After 语句? (或者)我应该为每个 table 分别创建单独的触发器吗?
下面是我的Table和触发器信息
CREATE TABLE books ( id integer, title varchar(100) NOT NULL, author varchar(100) NOT NULL, episode_id integer, chapter_id integer, published_date datetime NOT NULL, child_table_updated datetime );
CREATE TABLE episode ( id integer, title varchar(100) NOT NULL, episode_name varchar(100) NOT NULL, published_date datetime NOT NULL );
CREATE TABLE chapter ( id integer, title varchar(100) NOT NULL, chapter_name varchar(100) NOT NULL, published_date datetime NOT NULL );
INSERT INTO books VALUES
(1, 'My First SQL Book', 'Mary Parker', 1, 1, now(), now()),
(2, 'My First SQL Book', 'Mary Parker', 2, 1, now(), now()),
(3, 'My First SQL Book', 'Mary Parker', 1, 2, now(), now());
INSERT INTO episode VALUES
(1, 'Episode One', 'Simple Episode', now()),
(2, 'Episode Tow', 'Complicated Episode', now());
INSERT INTO chapter VALUES
(1, 'Chapter One', 'Simple Chapter', now()),
(2, 'Chapter Tow', 'Complicated Chapter', now());
CREATE TRIGGER updateBooksOnEpisodeUpdate
BEFORE UPDATE ON episode
FOR EACH ROW
UPDATE books
SET published_date = NOW() WHERE old.id=books.episode_id;
当我更新情节 table 中的任何现有行时,child_table_updated 列正在更新。
如果在 episodes/chapter table 中更新了任何行,我正在寻找一个选项来添加触发器,我想更新书籍 table。我可以在章节 table 上创建一个单独的触发器,但看看我们是否可以在单个触发器中做到这一点,这是最佳解决方案吗?
还有一个问题,触发器太多是否会成为数据库中的一个问题? (例如:如果我有大约 200 tables 并且有一个大约 120 tables 的触发器,这会是任何问题吗)
我们可以使用任何其他更好的选项来实现此功能而无需触发器吗?
感谢任何帮助!
您必须为每个 child table.
定义一个触发器
为一个动作定义了一个触发器 table。如果操作发生在多个 table 中的任何一个上,则无法定义执行的单个触发器。
does having too many triggers is going to be an issue in databases?
我对触发器进行了基准测试,我发现无论是否使用触发器,性能成本都与索引写入的数量成正比。
例如,如果您对具有 6 个索引的 table 执行更新,它必须为每个索引写入更改。成本大于具有 3 个索引的 table。
如果您对具有 3 个索引的 table 执行更新,并导致触发 运行,它对具有 3 个索引的不同 table 执行另一个更新,则总共更新了 6 个索引。
这与使用 6 个索引且没有触发器更新单个 table 的性能成本大致相同。
计算生成触发器的操作的索引写入次数,加上触发器执行的写入次数。
运行设置触发器还有其他一些轻微的开销,但与索引写入的次数相比可以忽略不计。
每当 child table 更新时,我都会尝试更新 parent tables。当只有一个 child table.
时,我可以创建一个触发器我有一个用例,其中我有多个 child table,我需要更新 parent table 当任何一个 tables 已更新。是否可以在触发器中添加多个 Before 或 After 语句? (或者)我应该为每个 table 分别创建单独的触发器吗?
下面是我的Table和触发器信息
CREATE TABLE books ( id integer, title varchar(100) NOT NULL, author varchar(100) NOT NULL, episode_id integer, chapter_id integer, published_date datetime NOT NULL, child_table_updated datetime );
CREATE TABLE episode ( id integer, title varchar(100) NOT NULL, episode_name varchar(100) NOT NULL, published_date datetime NOT NULL );
CREATE TABLE chapter ( id integer, title varchar(100) NOT NULL, chapter_name varchar(100) NOT NULL, published_date datetime NOT NULL );
INSERT INTO books VALUES
(1, 'My First SQL Book', 'Mary Parker', 1, 1, now(), now()),
(2, 'My First SQL Book', 'Mary Parker', 2, 1, now(), now()),
(3, 'My First SQL Book', 'Mary Parker', 1, 2, now(), now());
INSERT INTO episode VALUES
(1, 'Episode One', 'Simple Episode', now()),
(2, 'Episode Tow', 'Complicated Episode', now());
INSERT INTO chapter VALUES
(1, 'Chapter One', 'Simple Chapter', now()),
(2, 'Chapter Tow', 'Complicated Chapter', now());
CREATE TRIGGER updateBooksOnEpisodeUpdate
BEFORE UPDATE ON episode
FOR EACH ROW
UPDATE books
SET published_date = NOW() WHERE old.id=books.episode_id;
当我更新情节 table 中的任何现有行时,child_table_updated 列正在更新。
如果在 episodes/chapter table 中更新了任何行,我正在寻找一个选项来添加触发器,我想更新书籍 table。我可以在章节 table 上创建一个单独的触发器,但看看我们是否可以在单个触发器中做到这一点,这是最佳解决方案吗?
还有一个问题,触发器太多是否会成为数据库中的一个问题? (例如:如果我有大约 200 tables 并且有一个大约 120 tables 的触发器,这会是任何问题吗)
我们可以使用任何其他更好的选项来实现此功能而无需触发器吗?
感谢任何帮助!
您必须为每个 child table.
定义一个触发器为一个动作定义了一个触发器 table。如果操作发生在多个 table 中的任何一个上,则无法定义执行的单个触发器。
does having too many triggers is going to be an issue in databases?
我对触发器进行了基准测试,我发现无论是否使用触发器,性能成本都与索引写入的数量成正比。
例如,如果您对具有 6 个索引的 table 执行更新,它必须为每个索引写入更改。成本大于具有 3 个索引的 table。
如果您对具有 3 个索引的 table 执行更新,并导致触发 运行,它对具有 3 个索引的不同 table 执行另一个更新,则总共更新了 6 个索引。
这与使用 6 个索引且没有触发器更新单个 table 的性能成本大致相同。
计算生成触发器的操作的索引写入次数,加上触发器执行的写入次数。
运行设置触发器还有其他一些轻微的开销,但与索引写入的次数相比可以忽略不计。