2017-11-06 16 views
2

SQLの制約や条件

USE [dbname] 
GO 

ALTER TABLE [dbo].[tablename] WITH NOCHECK ADD CONSTRAINT [CK_table] CHECK (([field1] like ('[0-9a-zA-Z][0-9a-zA-Z]' OR '[0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z]') AND [field1] IS NOT NULL)) 
GO 

ALTER TABLE [dbo].[tablename] CHECK CONSTRAINT [CK_table] 
GO 


field1 = varchar[10] 

ゴールは許さ文字でサイズ2、サイズ3をチェックすることです

問題は「OR」エラーをスローします不明

+0

どのDBMSを使用していますか?適切なタグを含めてください。提供されるエラーは何ですか? – kchason

+4

'... OR [field1] like '[0-9a-zA-Z]' ... ' –

答えて

2

のこれを試してみてください:

USE [dbname] 
GO 

ALTER TABLE [dbo].[tablename] WITH NOCHECK ADD CONSTRAINT [CK_table] CHECK ([field1] like '[0-9a-zA-Z][0-9a-zA-Z]' OR [field1] like '[0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z]') AND [field1] IS NOT NULL 
GO 

ALTER TABLE [dbo].[tablename] CHECK CONSTRAINT [CK_table] 
GO 

あなたはここに問題を抱えている

([field1] like ('[0-9a-zA-Z][0-9a-zA-Z]' OR '[0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z]') 

これは正しい構文ではない(field1 like 'x' or 'y')のようなものを書いたことを意味します。 (field1 like 'x' or field1 like 'y')

+0

また、必ずかっこ内にORを入れてください(field1は' x 'やfield1のように' y ') – GuidoG

+0

間違いなく。実際に彼はそれもしました。 –

+0

ありがとう - 完璧に働いた。 – e2fx

0

NULLのチェックは、単純なNOT NULLという制約で処理する必要があります。あなたはそれを含める場合、正確に言葉で表現し、ちょうど第二の条件にタックませんする必要があります。

ALTER TABLE [dbo].[tablename] WITH NOCHECK 
    ADD CONSTRAINT [CK_table] 
     CHECK (([field1] like '[0-9a-zA-Z][0-9a-zA-Z]' OR 
        [field1] like '[0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z]' 
       ) AND 
       field1 is not null 
       ); 

LIKE保証値がNULLではないこと。追加のチェックは必要ありません。

ALTER TABLE [dbo].[tablename] WITH NOCHECK 
    ADD CONSTRAINT [CK_table] 
     CHECK ([field1] not like ('%[^0-9a-zA-Z][0-9a-zA-Z]%' AND 
       LEN(field1) BETWEEN 2 AND 3 AND 
       field1 is not null 
       ); 

第一の条件は、(二重否定を使用して)すべてが英数字であることを述べている:あなたはこれらのチェーンを持っているかのように

、あなたもこれを書くことができます。 2番目の列は、列の長さを指定します。 2つの長さの場合、2つの方法はほぼ同じです。 2〜6文字のフィールドを許可した場合、これは簡単になります。

+0

「NOT NULL」*が必要です。制約は 'false'を拒否し、' true'と 'unknown'を受け取ります - チェック制約に残されるのではなく' NOT NULL'でなければなりません。 –

+0

@MartinSmith。 。 。ありがとうございました。カラムを 'NULL'にしたくない場合は、常にNOT NULLを使用すると思います。 –