【发布时间】:2015-08-28 09:31:26
【问题描述】:
如果我创建两个表,并且我想将一个列设置为另一个表列的外键为什么我允许我设置外键列数据类型?
这没有任何意义还是我错过了什么?是否存在任何情况下具有外键的列故意具有不同的数据类型?
关于我的担忧更深入一点,我尝试使用 pgadmin 构建一些简单的 Postgres 数据库。我用主键serial 数据类型制作了第一个表。然后我尝试制作外键但是什么数据类型?我在某处看到serial 是bigint unsigned。但是这个选项在 pgadmin 中甚至不存在。当然我可以使用 sql 但是为什么我使用 gui 呢?所以我尝试了 Navicat,同样的问题。我觉得每次选择我都会在我的数据库设计中犯另一个错误......
编辑:
也许我问错了问题。 我被允许做建筑结构:
CREATE TABLE user
(
id bigint NOT NULL,
CONSTRAINT user_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
CREATE TABLE book
(
user integer,
CONSTRAINT dependent_user_fkey FOREIGN KEY (user)
REFERENCES user (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
我向表用户插入一些数据:
INSERT INTO user(id)
VALUES (5000000000);
但我不能投射以下插入:
INSERT INTO book(user)
VALUES (5000000000);
ERROR: integer out of range 是可以理解的,但明显的设计错误。
我的问题是:为什么当我们设置CONSTRAINT 时,数据类型没有得到验证。如果我错了,答案应该包含使用不同数据类型很有用的场景。
【问题讨论】:
-
我不知道你在说什么。 “设置外键列类型”是什么意思? SQL 语言要求表定义中的每一列都有一个数据类型。编写设置架构的 SQL 脚本要好得多。你靠 GUI 活着 - 你死在 GUI 上
-
恕我直言,serial不是数据类型,说
int4 default nexval('sequence')是个捷径 -
@greg thx 这实际上很有帮助。我发现了这个:postgresql.org/message-id/42A091A7.4050802@commandprompt.com
-
@a_horse_with_no_name 我同意每一列都应该有自己的数据类型,但是为什么将任何列设置为外键并不会强制更改该列的数据类型?因为你想要它,不是吗?
-
因为这是在 SQL 标准中定义 CREATE TABLE 语句的方式。另外:您可以在以后随时定义外键约束,它不必是 CREATE TABLE 语句的一部分。
serial或bigserial“快捷方式”的含义(和后果)在手册中有明确记录:postgresql.org/docs/current/static/…。
标签: sql postgresql