[英]create table constraint in mysql
我有一個表格,其中我有一些列a,b,c
並且對於每列,還有另一列,例如, (x,y,z)
,它們分別依賴於a,b,c
。
如果a,b,c
具有任何值,則x,y,z
將具有值1
a,b,c
並且如果a,b,c has null
,則將包含a,b,c has null
。
舉個例子,讓我們說,存儲在a
的值是2
, x
是依賴於它的列。 所以x
值為1
。
如果存儲在a
值為null
則x
值為null
。
那么有沒有一種方法可以在創建表時聲明這個約束。
除了觸發器之外,請提出建議。
如果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;
然后將您的其他查詢基於此視圖,而不是直接在表上。
您要查找的約束是檢查約束。
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中沒有實現 。 有一個可以追溯到2004年的這個功能的開放式錯誤報告 ,所以不要指望很快就能看到它。
其他人已回答您可以使用觸發器或視圖來實現所需的結果,這些是MySQL的正確答案。
您還可以使用一些簡單的技巧來部分約束數據:
x, y, z
的數據類型設置為enum('1')
。 這將阻止插入除null
和'1'
以外的null
,但不能確保值正確。 a, b, c
具有有限范圍的可能值,則可以為其他表創建外鍵約束,並使用a, b, c
每個可能值填充這些表。 x, y, z
(例如每小時一次或每天一次)。 如果錯誤x, y, z
可以糾正x, y, z
的值。 你可以在這里看到PostGreSQL的檢查約束
如果您需要進一步的建議,請解釋為什么觸發器不適合您的任務。
除了約束之外,您可以通過不存儲所有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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.