1

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

令我惊讶的是,尽管有参照完整性约束(该工作),数据库还是接受了它。我尝试使用 PostgreSQL 和 MySQL InnoDB 并且都允许。

例子:

在数据库“风味”中有一个数字主键(id),5 个条目(1 到 5)。我可以引入不良数据:

Icecream_1:名称:我的冰淇淋 flavor_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

4 回答 4

1

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

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

pgAdmin 禁止它。

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

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

于 2010-08-13T10:55:18.727 回答
0

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

您在 pgAdmin 中遇到错误的事实表明您正在使用与 pgAdmin 和您的测试脚本不同的数据库。

就 MySQL 而言,我会在测试数据库中寻找错误的默认引擎,或者如果您也忘记在那里创建 FK 约束(请注意,如果您使用不支持的引擎创建 FK 约束,您将不会收到错误'不支持 MySQL 的参照完整性)

于 2010-08-13T12:05:04.707 回答
0

谢谢大家的回答。

红宝石论坛上的某个人想通了。看起来强制 RI 的触发器在加载夹具之前被禁用。

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

于 2010-08-13T13:11:39.503 回答
0

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

于 2010-08-13T13:00:41.633 回答