MYSQL触发New和OLD

时间:2018-04-05 22:26:36

标签: mysql database-trigger

使用触发器时,如何从表中获取New / Old值?我尝试将以前的填充放入另一个表中并出现语法错误。我编辑了表格并放置了城市/国家架构,以便其他人可以查看并尝试帮助我。

DELIMITER $$

USE `world`$$

DROP TRIGGER /*!50032 IF EXISTS */ `previous_pop`$$

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `previous_pop` AFTER UPDATE ON city
    FOR country
    BEGIN
    previous.city_previous_pop = country.Old.Population;


    END;
$$

DELIMITER ;   

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'country
    Begin

国家架构;

TABLE_CATALOG   TABLE_SCHEMA    TABLE_NAME  COLUMN_NAME ORDINAL_POSITION    COLUMN_DEFAULT  IS_NULLABLE DATA_TYPE   CHARACTER_MAXIMUM_LENGTH    CHARACTER_OCTET_LENGTH  NUMERIC_PRECISION   NUMERIC_SCALE   DATETIME_PRECISION  CHARACTER_SET_NAME  COLLATION_NAME  COLUMN_TYPE COLUMN_KEY  EXTRA   PRIVILEGES  COLUMN_COMMENT
def sakila  country country_id  1   \N  NO  smallint    \N  \N  5   0   \N  \N  \N  smallint(5) unsigned    PRI auto_increment  select,insert,update,references 
def sakila  country country 2   \N  NO  varchar 50  150 \N  \N  \N  utf8    utf8_general_ci varchar(50)         select,insert,update,references 
def sakila  country last_update 3   CURRENT_TIMESTAMP   NO  timestamp   \N  \N  \N  \N  0   \N  \N  timestamp       on update CURRENT_TIMESTAMP select,insert,update,references 
def world   country Code    1       NO  char    3   3   \N  \N  \N  latin1  latin1_swedish_ci   char(3) PRI     select,insert,update,references 
def world   country Name    2       NO  char    52  52  \N  \N  \N  latin1  latin1_swedish_ci   char(52)            select,insert,update,references 
def world   country Continent   3   Asia    NO  enum    13  13  \N  \N  \N  latin1  latin1_swedish_ci   enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America')           select,insert,update,references 
def world   country Region  4       NO  char    26  26  \N  \N  \N  latin1  latin1_swedish_ci   char(26)            select,insert,update,references 
def world   country SurfaceArea 5   0.00    NO  float   \N  \N  10  2   \N  \N  \N  float(10,2)         select,insert,update,references 
def world   country IndepYear   6   \N  YES smallint    \N  \N  5   0   \N  \N  \N  smallint(6)         select,insert,update,references 
def world   country Population  7   0   NO  int \N  \N  10  0   \N  \N  \N  int(11)         select,insert,update,references 
def world   country LifeExpectancy  8   \N  YES float   \N  \N  3   1   \N  \N  \N  float(3,1)          select,insert,update,references 
def world   country GNP 9   \N  YES float   \N  \N  10  2   \N  \N  \N  float(10,2)         select,insert,update,references 
def world   country GNPOld  10  \N  YES float   \N  \N  10  2   \N  \N  \N  float(10,2)         select,insert,update,references 
def world   country LocalName   11      NO  char    45  45  \N  \N  \N  latin1  latin1_swedish_ci   char(45)            select,insert,update,references 
def world   country GovernmentForm  12      NO  char    45  45  \N  \N  \N  latin1  latin1_swedish_ci   char(45)            select,insert,update,references 
def world   country HeadOfState 13  \N  YES char    60  60  \N  \N  \N  latin1  latin1_swedish_ci   char(60)            select,insert,update,references 
def world   country Capital 14  \N  YES int \N  \N  10  0   \N  \N  \N  int(11)         select,insert,update,references 
def world   country Code2   15      NO  char    2   2   \N  \N  \N  latin1  latin1_swedish_ci   char(2)         select,insert,update,references 

城市架构:

TABLE_CATALOG   TABLE_SCHEMA    TABLE_NAME  COLUMN_NAME ORDINAL_POSITION    COLUMN_DEFAULT  IS_NULLABLE DATA_TYPE   CHARACTER_MAXIMUM_LENGTH    CHARACTER_OCTET_LENGTH  NUMERIC_PRECISION   NUMERIC_SCALE   DATETIME_PRECISION  CHARACTER_SET_NAME  COLLATION_NAME  COLUMN_TYPE COLUMN_KEY  EXTRA   PRIVILEGES  COLUMN_COMMENT
def sakila  city    city_id 1   \N  NO  smallint    \N  \N  5   0   \N  \N  \N  smallint(5) unsigned    PRI auto_increment  select,insert,update,references 
def sakila  city    city    2   \N  NO  varchar 50  150 \N  \N  \N  utf8    utf8_general_ci varchar(50)         select,insert,update,references 
def sakila  city    country_id  3   \N  NO  smallint    \N  \N  5   0   \N  \N  \N  smallint(5) unsigned    MUL     select,insert,update,references 
def sakila  city    last_update 4   CURRENT_TIMESTAMP   NO  timestamp   \N  \N  \N  \N  0   \N  \N  timestamp       on update CURRENT_TIMESTAMP select,insert,update,references 
def world   city    ID  1   \N  NO  int \N  \N  10  0   \N  \N  \N  int(11) PRI auto_increment  select,insert,update,references 
def world   city    Name    2       NO  char    35  35  \N  \N  \N  latin1  latin1_swedish_ci   char(35)            select,insert,update,references 
def world   city    CountryCode 3       NO  char    3   3   \N  \N  \N  latin1  latin1_swedish_ci   char(3)         select,insert,update,references 
def world   city    District    4       NO  char    20  20  \N  \N  \N  latin1  latin1_swedish_ci   char(20)            select,insert,update,references 
def world   city    Population  5   0   NO  int \N  \N  10  0   \N  \N  \N  int(11)         select,insert,update,references 

创建触发器之后我运行了这个:

UPDATE city
SET Population = 1
WHERE CountryCode = 'AFG';

SELECT Population, CountryCode FROM city;

Population  CountryCode
1   AFG
1   AFG
1   AFG
1   AFG

国家人口没有变化:

SELECT Population FROM country WHERE CODE = 'AFG';

Population
20387904

1 个答案:

答案 0 :(得分:1)

当有城市人口更新时,这是更新国家/地区的触发器。比方说,首尔市的人口从10M更新到11M;因此,国家的KOR人口也应该增加1M。触发器上的问题是" FOR country"的语法,它应该是" FOR EACH ROW"。也就是说,对于在city表中更新的每一行,请在国家/地区表上进行更新。旧城市人口与新城市人口之间的差异将在国家人口中增加。如果城市减少了人口,那么它也将从国家人口中减去。

CREATE TRIGGER `previous_pop` AFTER UPDATE ON city
    FOR EACH ROW
    BEGIN

      UPDATE country
      SET    Population = Population + (NEW.Population - OLD.Population)
      WHERE  Code = OLD.CountryCode;

    END;