数据库允许来自Rails Fixtures的坏外键

时间:2010-08-13 10:50:03

标签: mysql ruby-on-rails database postgresql fixtures

我正在使用Rails Fixtures将一些测试数据加载到我的数据库中,不小心我引入了一个超出范围的外键。

令我惊讶的是,数据库接受了它,尽管有参照完整性约束(这是有效的)。我尝试使用PostgreSQL和MySQL InnoDB,两者都允许。

示例:

在数据库“Flavors”中添加数字主键(id),5个条目(1到5)。我可以介绍坏数据:

Icecream_1:     名字:我的冰淇淋     flavour_id:6

如何加载灯具可以解决我的数据库限制问题?

谢谢。


这是两张桌子。有200个user_types(虚假数据)我能够为用户介绍user_type_id 201,但仅限于夹具,pgAdmin禁止它。

CREATE SEQUENCE user_types_id_seq;
CREATE TABLE user_types (
id SMALLINT
  NOT NULL
  DEFAULT NEXTVAL('user_types_id_seq'),
name VARCHAR(45) 
  NOT NULL 
  UNIQUE,
PRIMARY KEY (id));

CREATE SEQUENCE users_id_seq;
CREATE TABLE users (
id BIGINT
    NOT NULL
    DEFAULT NEXTVAL('users_id_seq'),
user_type_id SMALLINT
    NOT NULL
    REFERENCES user_types (id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY (id));


---------

Fixture

<% for i in (1..201) %>

user_<%= i %>:
    id: <%= i %>
    user_type_id: <%= i %>
<% end %>

正如我所说,innoDb和postgresql都接受了坏密钥。

由于

4 个答案:

答案 0 :(得分:1)

PostgreSQL不接受损坏的数据,不用担心。在MySQL中,它取决于引擎(必须是innoDB)和参数foreign_key_checks的(连接)设置。

您的表和约束如何?检查pgAdmin(或其他一些客户端)并将相关的数据模型转储到此处,而不是我们可以帮助您。

  

pgAdmin禁止它。

不,你的PostgreSQL数据库禁止它。 pgAdmin只是一个客户端,它只向数据库发送一个查询。数据库执行一些检查,违反了FK并返回错误。

看起来你正在使用错误的数据库(没有错误的引擎和/或设置的FK或MySQL),PostgreSQL在使用FK时工作正常。

答案 1 :(得分:0)

我同意弗兰克的观点。你的PostgreSQL测试数据库很可能没有正确设置。您忘记创建FK约束或禁用它们。

pgAdmin中出现错误这一事实表明您正在使用pgAdmin和测试脚本中的其他数据库。

就MySQL而言,我会在测试数据库中查找错误的默认引擎,或者您是否也忘记在那里创建FK约束(请注意,如果您创建FK约束,则不会出现错误不支持MySQL参照完整性的引擎

答案 2 :(得分:0)

检查测试数据库中的表定义。 IIRC,“rake db:test:prepare”在测试数据库中创建表时不保持保真度。

答案 3 :(得分:0)

谢谢大家的回答。

红宝石论坛上有人发现了这一点。看起来强制RI的触发器在加载灯具之前被禁用。

我不知道为什么,但它解决了这个错误。