我正在使用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都接受了坏密钥。
由于
答案 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的触发器在加载灯具之前被禁用。
我不知道为什么,但它解决了这个错误。