Триггеры MYSQL Новые и Старые

0

Как я могу получить значения 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
    Пожалуйста, поделитесь полным оператором CREATE TRIGGER или хотя бы полностью работающим (= неудачным) примером. Сообщение об ошибке не соответствует вашему запросу.
  • 0
    Но я не понимаю, как получить доступ к старым или новым данным из таблицы, каков синтаксис? @Kaii
Показать ещё 7 комментариев
Теги:
database-trigger

1 ответ

0
Лучший ответ

Это триггер для обновления страны при обновлении популяции города. Скажем, население Сеула обновляется с 10 до 11 миллионов; таким образом, население KOR в стране также должно увеличиться на 1M. Проблема с вашим триггером - синтаксис "FOR country", и он должен быть "ДЛЯ КАЖДОЙ РУКИ". То есть для каждой строки, обновленной в таблице города, обновите таблицу по странам. В населении страны будет добавлена разница между населением старого города и новым населением города. Если город сократит население, он также вычтен из страны.

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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню