2011-12-07 157 views
6

我有一個表格,其中有一些列a,b,c,每列還有另一列,分別取決於a,b,c(x,y,z)在mysql中創建表約束條件

x,y,z將有價值1如果a,b,c有任何價值,並且將包含空如果a,b,c has null

有關示例比方說, 存儲在a的值是2x是依賴於它的列。 所以x的值將爲1

如果存儲在a中的值是null那麼x將具有值null

那麼我們可以在表創建時聲明這個約束。

請建議除觸發器以外的任何其他內容。

+0

傢伙感謝您的回覆,但請建議除觸發器以外的任何其他事情,因爲我已經讀過,我們可以在創建表中添加一些約束條件.. –

+0

不,您不能。與大多數其他DBMS(Postgre,Oracle,SQL Server ...)不同,MySQL不支持檢查約束。 –

回答

7

如果xyz的目的是簡化一些查詢,然後,而不是xyz爲你的表列,你也可以考慮使用視圖做到這一點如

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; 

然後將您的其他查詢基於此視圖而不是直接在表上。

+0

嘿,謝謝你的迴應,但是在那張桌子上有很多地方插入發生,這是一個巨大的應用程序,我們有兩個不同的平臺... –

+0

請你詳細說明方法,或提供此參考這個。 –

+0

嗨。哪一點不清楚?關於視圖的MySQL文檔是[here](http://dev.mysql.com/doc/refman/5.6/en/views.html)。 – mikej

1

MySQL本身不處理CONSTRAINTS,但您可以在BEFORE INSERTBEFORE UPDATE事件中使用TRIGGER執行類似的行爲。但是,您必須依靠其他一些表級限制(NOT NULL)才能使其工作,如根據this other question on SO

在您的具體情況下,它看起來很像您希望使用觸發器計算您的x, y, z值在觸發器中的值,而不是用於防止插入具有「不正確」值的數據 - 但你的問題並沒有明確地表明這一點,所以這取決於你真正想要的東西。

1

是的,你可以使用triggers這個。

Trigger syntax章:

如果BEFORE觸發器失敗時,不進行

上的相應行的動作儘管你描述的情況意味着數據不被標準化。

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 
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未實現。這個功能有一個可以追溯到2004年的open bug report,所以不要期望很快就能看到它。

其他人已經回答說,您可以使用觸發器或視圖來獲得所需的結果,這些是MySQL的正確答案。

您還可以使用一些簡單的技巧部分限制你的數據:

  • 設置的x, y, z的數據類型enum('1')。這將防止插入除null'1'以外的值,但不能確保值是正確的。
  • 如果a, b, c有一個限制範圍的可能值,你可以創建外鍵約束與其他表和填充這些表與a, b, c
  • 每一個可能的值,您可以創建一個event爲按計劃更新x, y, z(如每小時一次或一天一次)。如果他們錯了,x, y, z的值可以更正。

你可以看到在行動中檢查約束在PostgreSQL here

如果您需要進一步的建議,請解釋爲什麼觸發器是不適合你的任務。