mySql 触发器未按预期工作

标签 mysql

我有两个表设置了触发器,这样在一个表上的插入将触发第二个表的同一主键的列的增量(因为两个表都通过外键链接),但是目前仅增量一次,然后对于任何后续插入都不会增量。我的想法是,这可能与我设置 key 的方式有关,但我不确定,有人可以解释一下吗:

CREATE TABLE Members(
    ID  INT  UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
    FIRST_NAME  TEXT(16),
    LAST_NAME  TEXT(16),
    TITLE  TEXT(7), /** 7 CHARS for  'Student'*/
    INSTITUTION  VARCHAR(2048),
    No_Publications INT NOT NULL,
    PRIMARY KEY(ID)
  );

CREATE TABLE Papers(
    ISBN  INT UNSIGNED NOT NULL UNIQUE,
    Title  TEXT(4),
    Publish_Date  DATE NOT NULL,
    Topic  TEXT(128),
    PRIMARY KEY(ISBN)
  );

CREATE TABLE Publications(
    Author_ID  INT  UNSIGNED NOT NULL UNIQUE,
    ISBN  INT UNSIGNED NOT NULL UNIQUE,
    PRIMARY KEY (Author_ID, ISBN),
    FOREIGN KEY(Author_ID) REFERENCES Members(ID) ON DELETE RESTRICT ON UPDATE CASCADE,
    FOREIGN KEY(ISBN) REFERENCES Papers(ISBN) ON DELETE RESTRICT ON UPDATE CASCADE /**Used in
    many to many relations*/
  );

  CREATE TRIGGER New_Publication AFTER INSERT ON Publications
  FOR EACH ROW
  UPDATE Members SET No_Publications = No_Publications + 1
  WHERE Members.ID = Publications.Author_ID;

编辑:我希望 No_Publications 随着出版物表上的插入而增加

编辑2:实现NEW关键字后,自动增量现在可以工作,但是现在会发生以下情况:

向 1 个新成员添加 1 篇新论文后,该论文将在数据库中注册,但是,尽管成员表中发生增量,但随后向同一成员添加的论文不会注册。

插入到出版物表中是由于上面为了透明度而附加的论文表的结果。

最佳答案

触发器应该是:

CREATE TRIGGER New_Publication AFTER INSERT ON Publications 
FOR EACH ROW 
UPDATE Members SET No_Publications = No_Publications + 1 
WHERE Members.ID = NEW.Author_ID;

尽管他的专栏也应该在删除时更新,并且此专栏会再次出现database normalization因为您可以在没有列的情况下获取此信息,因此它仅在某些情况下对提高性能和避免计数有用。

关于mySql 触发器未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48051137/

相关文章:

php - 根据选择选项(AJAX?)自动更改 PHP 变量

mysql - 数据库表可以排序以使 NULL 值出现在底部吗?

php - 无法使用php向mysql表中插入数据

mysql - 将多行合并为一行

php - 用php反转mysql数据库结果

MySQL 出现错误代码 1452,但值和表确实存在

php - 如何将 JSON 字符串转换为数组

php - 如何在AWS中低成本运行laravel php应用程序?

mysql - 从 MySql 转储导入到 hive

mysql - 计算表格行数