- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:在 Postgresql 中,如果表 temp_person_two
继承自 temp_person
,如果 parent 表,子表上的默认列值将被忽略被改变了。
如何复制:
首先,创建表和子表。子表应该有一列具有默认值。
CREATE TEMPORARY TABLE temp_person (
person_id SERIAL,
name VARCHAR
);
CREATE TEMPORARY TABLE temp_person_two (
has_default character varying(4) DEFAULT 'en'::character varying NOT NULL
) INHERITS (temp_person);
接下来,在父表上创建一个触发器,将其数据复制到子表(我知道这看起来像是糟糕的设计,但这是显示问题的最小测试用例)。
CREATE FUNCTION temp_person_insert() RETURNS trigger
LANGUAGE plpgsql
AS '
BEGIN
INSERT INTO temp_person_two VALUES ( NEW.* );
RETURN NULL;
END;
';
CREATE TRIGGER temp_person_insert_trigger
BEFORE INSERT ON temp_person
FOR EACH ROW
EXECUTE PROCEDURE temp_person_insert();
然后向parent插入数据,从child中选择数据。数据应该是正确的。
INSERT INTO temp_person (name) VALUES ('ovid');
SELECT * FROM temp_person_two;
person_id | name | has_default
-----------+------+-------------
1 | ovid | en
(1 row )
最后,通过添加一个新的、不相关的列来更改父表。尝试插入数据并观察发生“非空约束”违规:
ALTER TABLE temp_person ADD column foo text;
INSERT INTO temp_person(name) VALUES ('Corinna');
ERROR: null value in column "has_default" violates not-null constraint
CONTEXT: SQL statement "INSERT INTO temp_person_two VALUES ( $1 .* )"
PL/pgSQL function "temp_person_insert" line 2 at SQL statement
我的版本:
testing=# select version();
version
-------------------------------------------------------------------------------------------------------
PostgreSQL 8.4.17 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.4.real (Debian 4.4.5-8) 4.4.5, 64-bit
(1 row)
最佳答案
它一直存在到 9.3,但修复起来会很棘手,我不确定这是否只是不良行为而不是错误。
约束仍然存在,但请查看列顺序。
Table "pg_temp_2.temp_person"
Column | Type | Modifiers
-----------+-------------------+-----------------------------------------------------------------
person_id | integer | not null default nextval('temp_person_person_id_seq'::regclass)
name | character varying |
Number of child tables: 1 (Use \d+ to list them.)
Table "pg_temp_2.temp_person_two"
Column | Type | Modifiers
-------------+----------------------+-----------------------------------------------------------------
person_id | integer | not null default nextval('temp_person_person_id_seq'::regclass)
name | character varying |
has_default | character varying(4) | not null default 'en'::character varying
Inherits: temp_person
ALTER TABLE
Table "pg_temp_2.temp_person_two"
Column | Type | Modifiers
-------------+----------------------+-----------------------------------------------------------------
person_id | integer | not null default nextval('temp_person_person_id_seq'::regclass)
name | character varying |
has_default | character varying(4) | not null default 'en'::character varying
foo | text |
Inherits: temp_person
它在您的第一个示例中有效,因为您有效地做了:
INSERT INTO temp_person_two (person_id,name)
VALUES (person_id, name)
但是看看您的新列在子表中的添加位置 - 最后!所以你最终得到了
INSERT INTO temp_person_two (person_id,name,has_default)
VALUES (person_id, name, foo)
而不是你所希望的:
INSERT INTO temp_person_two (person_id,name,foo)...
那么 - 这里的正确行为是什么?如果 PostgreSQL 打乱了子表中的列,可能会破坏代码。如果没有,那也可能会破坏代码。事实上,如果不对 PG 代码进行实质性更改,我认为第一个选项是行不通的,因此从中期来看不太可能这样做。
故事的寓意:明确列出您的 INSERT 列名。
手动可能需要一段时间。你知道任何带有正则表达式的语言吗? ;-)
关于postgresql - 在 Postgresql 8.4 中更改父表会破坏子表默认设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19227920/
我正在使用 Sharepiont,它吐出的代码充其量是困惑的。 我在一个表中有一个 div 的 ID,该表在另一个表中,我需要获取父表的父表。 这是我正在使用的 JsFiddle: http://js
我是一名优秀的程序员,十分优秀!