アクセスや DAO でチェック制約を作成することはできますか?
-
11-09-2019 - |
質問
アクセス (ジェット?) テーブルにチェック制約を作成しようとしています。
したがって、アクセスで.mdbファイルを開き、クエリに移動します - >デザインビューでクエリを作成し、ESCを入力し、メニュー - > [ビュー - >クエリとタイプタイプ
テーブルXを作成します(番号、チェック(A> 20))
しかし、アクセスは「フィールド定義の構文エラー」があると考えます。しかし、私はそうは思いません。したがって、私の質問:アクセスを使用してチェック制約を作成することは可能ですか。もしそうなら:どうやって。
さらに、GUI ではなく dao/vba を使用して制約を作成したいと考えています。それは可能ですか?
そして最後に、少し関連したことを述べます。Access に SQL ステートメントを入力するにはどうすればよいですか。それを行うためにクエリ -> デザインビュー -> クエリ -> ビュールートを使用する必要があるとは想像できません。私は非常に気に入っている Oracle の SQL*Plus に慣れていますが、アクセスに関しても同様のものがあることを願っています。
入力reneをありがとう
解決
ここにいくつかのメモがあります。
Oracle のパススルー クエリを作成できます (メニューの [クエリ] > [SQL 固有] > [パススルー] を選択します)。
Access 2003 以降、SQL Server 互換構文 (ANSI 92) を選択できるようになりました (http://office.microsoft.com/en-us/access/HA010345621033.aspx)
VBA/DAOによる検証ルール
''Reference: Microsoft DAO x.x Object Library
Dim tdf As TableDef
Dim db As Database
Set db = CurrentDb
Set tdf = db.TableDefs("Table1")
tdf.Fields("aDouble").ValidationRule = "<10"
tdf.Fields("aDouble").ValidationText = "Must be less than 10"
ADO / VBA による制約。[中級 Microsoft Jet SQL for Access 2000](http://msdn.microsoft.com/en-us/library/aa140015(office.10).aspx)
''Reference: Microsoft ADO Ext. x.x for DDL and Security
Dim cn As ADODB.Connection 'For action queries
Dim rs As ADODB.Recordset 'For select queries
Dim s As String
Dim RecordsAffected As Long
Set cn = CurrentProject.Connection
''You can store sql in a table
s = DLookup("SQLText", "sysSQL", "ObjectName='q1'")
''Result: CREATE TABLE tblCreditLimit (LIMIT DOUBLE)
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
''You can run queries from VBA
s = "INSERT INTO tblCreditLimit VALUES (100)"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
s = "CREATE TABLE tblCustomers (CustomerID COUNTER, CustomerName Text(50))"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
s = "INSERT INTO tblCustomers VALUES (1, 'ABC Co')"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
s = "ALTER TABLE tblCustomers " _
& "ADD COLUMN CustomerLimit DOUBLE"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
''You can add contraints using ADO like so:
s = "ALTER TABLE tblCustomers " _
& "ADD CONSTRAINT LimitRule " _
& "CHECK (CustomerLimit <= (SELECT LIMIT " _
& "FROM tblCreditLimit))"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
s = "UPDATE tblCustomers " _
& "SET CustomerLimit = 200 " _
& "WHERE CustomerID = 1"
''Error occurs here
cn.Execute s, RecordsAffected
s = "UPDATE tblCustomers " _
& "SET CustomerLimit = 90 " _
& "WHERE CustomerID = 1"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
''Clean up
''You cannot do this through the database window,
''because of the constraint.
s = "ALTER TABLE tblCustomers DROP CONSTRAINT LimitRule "
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
s = "DROP TABLE tblCustomers "
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
s = "DROP TABLE tblCreditLimit "
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
他のヒント
列の検証ルールがあります。 あなたはアクセスのためのVBを使用することができます。ここでのSQL * Plusのない無... 本物のSQL Serverのすべての利点とし、フロントのみ、アクセスを使用する
- あなたは常にデータソースとしてSQL Expressを使用することができます。 Accessでこれを行うには、まず ANSIへのインターフェースを開く必要があります-92クエリモードに。私はあなたのSQLのDDLコードをテストしてみた:それが正常に動作し、型FLOAT
(ダブル)の列を作成します。
は、この使用してDAOを行うことはできませんが、あなたはADOを使用することができます。かいつまん:アクセスチームはADOを優遇したところCHECK
制約は、Jet 4.0の時代にエンジンに導入しました。 Access2007からの影響で、アクセスチームはDAOを有利に戻っているが、DAOでのJet 4.0の「穴」をプラグインする至っていません。だから、Jet 4.0の-onlyの機能の大半を(圧縮可能なデータ型は、固定長テキストデータ型、高速な外部キーなど)を使用するには、ADOを使用する必要があります。
クエリビルダーで標準ANSIを使用することはできません。この設定を変更した場合、あなたが持っているとして、あなたは、クエリビルダでSQLを使用することができます。しかし私は、既存のデータベースのために、この設定を変更することをお勧めしません。
これを行うと、あなたが入力できます:
CREATE TABLE z1
(id int IDENTITY , FirstName CHAR, LastName CHAR, SSN INTEGER ,
check (id < 20),
constraint Mypk primary key (id) )
は、あなたでは、単にアクセスコマンドラインプロンプトを取得するには、Ctrl-Gを強打し、あなたがして入力することができ、クエリビルダでSQLを保存する必要があり、ちょうどSQLで入力したくありませんP>
currentproject.Connection.Execute "CREATE TABLE
z1(id int IDENTITY , FirstName CHAR, LastName CHAR, SSN INTEGER ,
check (id < 20),
constraint Mypk primary key (id) )"
上記の1行に入力されます。あなたが望むのであれば、あなたはコマンドラインプロンプトを使用することができます..