1

MS Access 2010 を使用しており、SQL を使用してテーブルを作成しようとしています。チェック制約をいくつか入れたいのですが、いくつか問題があります。

CREATE TABLE Test (
tester Text CHECK (tester IN ('ABC', 'BCD', 'CDE'))
);

構文エラーが発生します。

助言がありますか?

ありがとうございました!

編集:私が明確でなかったら申し訳ありません。私が実際に望んでいるのは、テスターが「ABC」、「BCD」、または「CDE」のいずれかであることを確認することです。これらは、彼が持つことができる唯一の値です。

EDIT2:私は何か他のことを試しました:

CREATE TABLE Test (
tester Text NOT NULL,
CONSTRAINT m_pk PRIMARY KEY(tester),
CONSTRAINT check_tester CHECK (DATALENGTH(tester) > 2)
);

また、構文エラーが発生します。テキスト値のチェックで本当に理解できないことはありますか? これらのどちらが間違っているのか、おそらくわかりません。

4

3 に答える 3

4

Jet 4以降、CHECKADOから実行されるAccess DDLでは制約がサポートされていますが、DAOからはサポートされていません。

Test制約付きのテーブルを作成する単一のDDLステートメントを実行できます。テーブルを作成するために1つのステートメントを実行してから、制約を追加するために別のステートメントを実行する必要はありません。

CREATE TABLE Test
    (
        tester TEXT(255),
        CONSTRAINT ABC_or_BCD_or_CDE CHECK
            (
                tester IN ('ABC', 'BCD', 'CDE')
            )
    );

ピースを調べやすくするために、そのようにフォーマットしました。このVBAを使用して、ステートメントを実行できます。

strSql = "CREATE TABLE Test ( tester Text(255)," & vbCrLf & _
    "CONSTRAINT ABC_or_BCD_or_CDE" & vbCrLf & _
    "CHECK ( tester IN ('ABC', 'BCD', 'CDE')));"
Debug.Print strSql
CurrentProject.Connection.Execute strSql

ノート:

  • CurrentProject.ConnectionはADOオブジェクトであるため、その.Executeメソッドは成功します。CurrentDb.Execute(DAOメソッド)を使用した同じステートメントは失敗します。
  • ADOでは、フィールドを(の代わりに)TEXT長さを含まないものとして宣言すると、メモフィールドが得られます。tester TEXTtester TEXT(255)
于 2013-03-18T01:57:52.777 に答える
2

接続に対して実行する必要があります。

ssql = "CREATE TABLE Test (tester Text)"
CurrentProject.Connection.Execute ssql

ssql = "ALTER TABLE test ADD CONSTRAINT " _
     & "myrule CHECK (tester IN ('ABC', 'BCD', 'CDE'))"
CurrentProject.Connection.Execute ssql

または

sSQL = "CREATE TABLE Test (tester Text, " _
     & "CONSTRAINT myrule CHECK (tester IN ('ABC', 'BCD', 'CDE')))"

この場合の myrule という名前は、たとえ別のテーブルであっても、存在してはならないことに注意してください。

いくつかのメモ:アクセスおよび/または DAO でチェック制約を作成することは可能ですか?

于 2013-03-18T00:31:47.097 に答える
-1

残念ながら、MS Access では主キーと外部キー以外の CHECK 制約が許可されていないようです。私の先生は昨年まで Oracle でコースを教えていましたが、MS Access ではこれができないことを理解していなかったようです。

于 2013-03-18T00:42:11.730 に答える