2016-06-19 8 views
3

私はMySQLのテーブルを持っています。私はテーブルの列の値を定数の整数に設定したいと思います。これどうやってするの?MySQLテーブルの定数カラムの値

+0

?そのレコードを挿入して、定数値で指定された値を置き換えますか? – 1000111

+0

いいえ、私はその値を許可するように制約したいので、例外などがほしいと思うでしょう。 – 1N5818

答えて

4

残念ながら、MySQLはSQLチェック制約をサポートしていません。互換性の理由から、 をDDLクエリで定義することはできますが、ちょうど無視された です。 BEFORE INSERTおよびBEFORE UPDATEトリガー を作成して、 のデータ要件が満たされていない場合にエラーを引き起こすか、フィールドをデフォルト値に設定することができます。

ここでは、MYSQL TRIGGERを経由する方法を見つけることができます。

サンプルテーブル:

DROP TABLE IF EXISTS `constantvaluetable`; 
CREATE TABLE `constantvaluetable` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `constValue` int(11) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB; 

トリガ:

DROP TRIGGER IF EXISTS trigger_const_check; 
delimiter // 
CREATE TRIGGER trigger_const_check BEFORE INSERT ON constantvaluetable 
    FOR EACH ROW 
    BEGIN 
     IF NEW.constValue <> 71 THEN 
     SIGNAL SQLSTATE '45000' SET message_text ='Only allowed value is 71'; 
     END IF; 
    END // 
delimiter ; 

試験:

INSERT INTO constantvaluetable(constValue) VALUES(71); 

INSERT INTO constantvaluetable(constValue) VALUES(66); 

結果:

最初のinsert文は成功します。

2番目のinsert文は失敗します。そして、次のエラーメッセージが表示されます:

を[のErr] 1644 - のみ許容値は71

です。注意:はあなたのCONSTANT値が71であると仮定します。

0

設定時にテーブルにCHECKという制約を設定するだけです。このような何かは、彼らが他のDBMSで行うようしかし、MySQLので、CHECK制約は、同じように動作していない、ほとんどのDBMSで、あなたが必要とするすべて


CREATE someTable 
(
someValue int(4) CHECK (someValue = 4) 
) 

です。状況はやや難解です。答えはここにあるようです:https://stackoverflow.com/a/14248038/5386243

+0

MySQLは 'CHECK CONSTRAINT'をサポートしていません – 1000111

+0

残念ながら、これらはMySQLでサポートされていないことが判明しました。私はとにかくupvoted。 – 1N5818

+0

ありがとうございます。 MySQLのCHECKの回避策にリンクするための答えを更新しました。 – samdoj

1

本当にやりたいですか?

それはあなただけで一定の値をチェックしたいあなたのケースでは、より複雑な条件のために使用することができるので、71のトリガー溶液は、汎用的なアプローチですが、以下は、

Select Field1, field2, field3 , 5 as `ConstantField` from myTable 
+0

私が持っている問題は、より複雑で、行が参照テーブルへの二重外部キーとして制約されています。定数は、マスターリストを参照するn番目のテーブルへの参照です。 – 1N5818

+0

まだ、 'JOIN refTable ON(refTable.id = ConstantField)'もうまくいくはずです。あるテーブルが定数値を参照している場合、ONステートメントは冗長であり、破棄することができます。 –

0

を十分ではないだろうデータベースロジックに近づくことができ、それに許容値を含むテーブルに外部キーを追加することができます。

create table tbl_checkconst (constraintvalue int primary key); 
insert into tbl_checkconst values (71); 

alter table yourtable 
add constraint fk_yourtable_constcheck 
foreign key (column1) 
references tbl_chechconst (constraintvalue); 

それは(それがインデックスを追加する必要がありますので)実際にいくつかのオーバーヘッドが追加されますが、データベース・ロジックであなたの制約を表現するだろう、とあなたの定数は、通常は、このようにデータベースモデルに設計された意味を持っています(現在は1つのみの値ですが)、あなた(および正しい権限を持つすべてのユーザー)は、トリガーコードを変更せずにtbl_checkconst表に値を追加することで、より多くの値を簡単に追加できます。あなたのコメントの一つでは、あなたが「参照テーブルに二重の外部キー」を作成しようとしていると述べた。

は、私はそれを追加しましたもう一つの理由は、私はあなたが本当に実際に外部キーを探していると思うことです。私はそれを正しく理解していれば、あなたがforeign keyの列を結合することができますので、あなたは、複合外部キーを使用することがあります:

指定された値が一定の値と一致しない場合はどう
alter table yourtable 
add constraint fk_yourtable_col1col2 
foreign key (column1, column2) 
references your_reference_table (refcolumn1, refcolumn2); 
関連する問題