我們如何才能增加其強制執行一列只有正值的約束。正整數約束添加到一個整數列在MySQL
嘗試了以下MySQL的聲明,但它不工作
create table test (test_column integer CONSTRAINT blah > 0);
我們如何才能增加其強制執行一列只有正值的約束。正整數約束添加到一個整數列在MySQL
嘗試了以下MySQL的聲明,但它不工作
create table test (test_column integer CONSTRAINT blah > 0);
你會使用關鍵字unsigned
,以表明該整數不允許「簽到」(即 - 它只能爲正) :
CREATE TABLE test (
test_column int(11) unsigned
);
你可以閱讀更多有關數字數據類型(簽署&無符號)here。
至於實際約束,以防止插入的負值,MySQL有可在CREATE TABLE
語句中使用一個CHECK
子句,然而,根據該文檔:
的CHECK子句被解析,但被所有存儲引擎忽略。
僅供參考,這裏是你將如何使用它(儘管它會執行精絕,只是什麼都不做 - 爲手動狀態):
CREATE TABLE test (
test_column int(11) unsigned CHECK (test_column > 0)
);
UPDATE(剔除負值完全)
我從幾個要與負值查詢被完全拒絕,而不是設置爲0
(作爲一個正常的交易爲unsigned
列會做)你的評論注意到。沒有約束,可以在總做到這一點(我知道的,至少),但是,如果你打開嚴格模式(與STRICT_TRANS_TABLES
),其插入一個負值無符號列的任何查詢將失敗,錯誤(與任何-其他數據插入錯誤,如無效enum
值一起)。
您可以通過您的插入的命令之前,運行以下命令進行測試:
SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';
如果你的作品,你可以用sql-mode="STRICT_TRANS_TABLES"
更新你的MySQL配置或使用(我不知道,如果SET
命令將影響全球的MySQL配置的,因此它可能是更好的更新實際的配置文件)。
您應該使用無符號整數數據類型。欲瞭解更多信息,click here
解決這個問題的辦法就是明確地告訴MySQL服務器創建一個無符號整數。
CREATE TABLE tbl_example (
example_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
example_num INT UNSIGNED NOT NULL,
example_text TEXT
PRIMARY KEY (`example_id`)
);
這是我所得到的,當我在我的本地MySQL服務器上運行下面的語句 'MySQL的「插入世界值(-2);'' 查詢行,1行受影響,1個警告(0.01秒)' – user462455
只是使用unsigned
只允許正值。
CREATE TABLE hello
(
world int unsigned
);
取消對該行,你會看到錯誤說:數據截斷:出於對列 '世界' 範圍值在第1行:
但無符號類型仍允許插入負整數(它將負整數轉換爲零)。它拋出一個警告,但仍然查詢通過 – user462455
這是我所得到的,當我在我的本地MySQL服務器上運行下面的語句 'MySQL的「插入世界值(-2);'' 查詢行,1行受影響,1次警告(0.01秒)' – user462455
'unsigned' <>正值。 'unsigned' ==不是負數。 – maxhb