我有一個表格,其中有一些列a,b,c
,每列還有另一列,分別取決於a,b,c
和(x,y,z)
。在mysql中創建表約束條件
x,y,z
將有價值1
如果a,b,c
有任何價值,並且將包含空如果a,b,c has null
。
有關示例比方說, 存儲在a
的值是2
和x
是依賴於它的列。 所以x
的值將爲1
。
如果存儲在a
中的值是null
那麼x
將具有值null
。
那麼我們可以在表創建時聲明這個約束。
請建議除觸發器以外的任何其他內容。
我有一個表格,其中有一些列a,b,c
,每列還有另一列,分別取決於a,b,c
和(x,y,z)
。在mysql中創建表約束條件
x,y,z
將有價值1
如果a,b,c
有任何價值,並且將包含空如果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;
然後將您的其他查詢基於此視圖而不是直接在表上。
嘿,謝謝你的迴應,但是在那張桌子上有很多地方插入發生,這是一個巨大的應用程序,我們有兩個不同的平臺... –
請你詳細說明方法,或提供此參考這個。 –
嗨。哪一點不清楚?關於視圖的MySQL文檔是[here](http://dev.mysql.com/doc/refman/5.6/en/views.html)。 – mikej
MySQL本身不處理CONSTRAINTS
,但您可以在BEFORE INSERT
和BEFORE UPDATE
事件中使用TRIGGER
執行類似的行爲。但是,您必須依靠其他一些表級限制(NOT NULL
)才能使其工作,如根據this other question on SO。
在您的具體情況下,它看起來很像您希望使用觸發器計算您的x, y, z
值在觸發器中的值,而不是用於防止插入具有「不正確」值的數據 - 但你的問題並沒有明確地表明這一點,所以這取決於你真正想要的東西。
而且限制,你可以通過不在所有的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
你正在尋找的約束是檢查約束。
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年的open bug report,所以不要期望很快就能看到它。
其他人已經回答說,您可以使用觸發器或視圖來獲得所需的結果,這些是MySQL的正確答案。
您還可以使用一些簡單的技巧部分限制你的數據:
x, y, z
的數據類型enum('1')
。這將防止插入除null
和'1'
以外的值,但不能確保值是正確的。a, b, c
有一個限制範圍的可能值,你可以創建外鍵約束與其他表和填充這些表與a, b, c
x, y, z
(如每小時一次或一天一次)。如果他們錯了,x, y, z
的值可以更正。你可以看到在行動中檢查約束在PostgreSQL here
如果您需要進一步的建議,請解釋爲什麼觸發器是不適合你的任務。
傢伙感謝您的回覆,但請建議除觸發器以外的任何其他事情,因爲我已經讀過,我們可以在創建表中添加一些約束條件.. –
不,您不能。與大多數其他DBMS(Postgre,Oracle,SQL Server ...)不同,MySQL不支持檢查約束。 –