我有一个表格,其中我有一些列a,b,c
,每列都有另一列,例如(x,y,z)
,它分别依赖于a,b,c
。
x,y,z
具有任何值,则 1
将具有值a,b,c
,如果a,b,c has null
将包含空值。
举个例子让我们说,
a
中存储的值为2
,x
是依赖于它的列。
因此x
的值为1
。
如果a
中存储的值为null
,则x
的值为null
。
所以有一种方法可以在表创建时声明这个约束。
请提出除触发器以外的任何建议。
答案 0 :(得分:7)
如果x
,y
和z
的目的是简化某些查询,而不是x
,y
和z
作为您桌面上的列,您还可以考虑使用视图来执行此操作,例如
create view myview as
select a, b, c,
if (isnull(a), null, 1) as x,
if (isnull(b), null, 1) as y,
if (isnull(c), null, 1) as z
from mytable;
然后将您的其他查询基于此视图,而不是直接在表格上。
答案 1 :(得分:4)
您要查找的约束是检查约束。
CREATE TABLE test
(
a varchar(10),
b varchar(10),
c varchar(10),
x integer,
y integer,
z integer,
CONSTRAINT chk_X_Nulls CHECK ((a is null and x is null) or (a is not null and x = 1)),
CONSTRAINT chk_Y_Nulls CHECK ((b is null and y is null) or (b is not null and y = 1)),
CONSTRAINT chk_Z_Nulls CHECK ((c is null and z is null) or (c is not null and z = 1))
);
不幸的是这在MySQL中没有实现。有一个open bug report可以追溯到2004年这个功能,所以不要指望很快看到它。
其他人已回答您可以使用触发器或视图来实现所需的结果,这些是MySQL的正确答案。
您还可以使用一些简单的技巧来部分限制数据:
x, y, z
的数据类型设置为enum('1')
。这样可以防止插入null
和'1'
以外的值,但不会确保值正确。a, b, c
具有有限范围的可能值,您可以为其他表创建外键约束,并使用a, b, c
x, y, z
(例如每小时一次或每天一次)。如果错误,可以更正x, y, z
的值。您可以使用PostGreSQL here
查看检查约束如果您需要进一步的建议,请解释为什么触发器不适合您的任务。
答案 2 :(得分:1)
MySQL本身并不处理CONSTRAINTS
,但您可以在BEFORE INSERT
和BEFORE UPDATE
事件上使用TRIGGER
实现类似的行为。但是,根据this other question on SO,您将不得不依赖其他一些表级约束(NOT NULL
)来使其正常工作。
在您的特定情况下,它看起来很像您希望使用触发器来计算触发器中x, y, z
值的值,而不是使用它来防止插入具有“不正确”的数据价值观 - 但你的问题并没有明确说明这一点,所以这取决于你真正想要的东西。
答案 3 :(得分:1)
答案 4 :(得分:1)
除了约束之外,您可以通过不存储所有x,y,z列并使用视图来获得类似的结果:
CREATE VIEW myView AS
SELECT
a, b, c,
( a = a ) AS x,
( b = b ) AS y,
( c = c ) AS z
FROM myTable