Рельсы проблемы внешнего ключа MySQL - PullRequest
2 голосов
/ 21 февраля 2011

Я пытаюсь добавить внешние ключи в свою таблицу, используя следующий код:

  constraint_name = "fk_#{from_table}_#{to_table}"
  execute %{ 
    CREATE TRIGGER #{constraint_name}_insert 
    BEFORE INSERT ON #{from_table} 
    FOR EACH ROW BEGIN
      SELECT 
        RAISE(ABORT, "constraint violation: #{constraint_name}")
      WHERE 
        (SELECT id FROM #{to_table} WHERE 
          id = NEW.#{from_column}) IS NULL
    END
  }

Я получаю следующую ошибку:

Mysql2::Error: Not allowed to return a result set from a trigger:  
    CREATE TRIGGER fk_brands_products_insert 
    BEFORE INSERT ON brands 
    FOR EACH ROW BEGIN
    SELECT 
      RAISE(ABORT, "constraint violation: fk_brands_products")
    FROM brands
    WHERE 
      (SELECT id FROM products WHERE id = NEW.brand_id) IS NULL;
      END;

Что не так с моим сценарием SQL?

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Вы можете добавить ограничение внешнего ключа MySQL следующим образом:

ALTER TABLE #{from_table}
  ADD CONSTRAINT #{constraint_name} FOREIGN KEY
  (#{from_column}) REFERENCES #{to_table}(id)

Это будет ограничивать from_column on from_table значениями в id в # {to_table}.

PS: если вы не используетене хотите называть ограничение, вы можете сделать это:

ALTER TABLE #{from_table}
  ADD FOREIGN KEY
  (#{from_column}) REFERENCES #{to_table}(id)
0 голосов
/ 21 февраля 2011

Как гласит ошибка, триггеру не разрешено возвращать набор результатов. Даже если вы выдаете ошибку, MySql не нравится выражение SELECT. Попробуйте использовать IF:

IF EXISTS(SELECT id FROM #{to_table} WHERE 
          id = NEW.#{from_column}) = 0 THEN
    RAISE(ABORT, "constraint violation: #{constraint_name}");
END IF;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...