是否可以在访问和/或DAO中创建检查约束?

时间:2009-11-02 10:39:26

标签: ms-access access-vba dao

我正在尝试在访问(jet?)表上创建一个检查约束。

因此,我打开带有访问权限的.mdb文件,进入查询 - >在设计视图中创建查询, 输入esc,然后菜单 - >视图 - >查询,最后输入

创建表X(   一个号码,   检查(a> 20) )

但访问认为我在字段定义中有“语法错误”。但是,我不这么认为。因此我的问题是:是否可以创建具有访问权限的检查约束。如果是这样:如何。

此外,我想用dao / vba创建约束,而不是在GUI上。这可能吗?

最后,在一个稍微相关的说明中:如何输入sql语句进入访问。我无法想象我必须使用query-> design view-> query-> view route才能做到这一点。我已经习惯了Oracle的SQL * Plus,我非常喜欢它,我希望它也有类似的访问权限。

感谢您的任何意见 雷

4 个答案:

答案 0 :(得分:2)

以下是一些注释。

您可以为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的约束。请参阅[适用于Access 2000的中间Microsoft Jet SQL](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

答案 1 :(得分:1)

列上有验证规则。 您可以使用VB进行访问。这里没有SQL * Plus ...... 您始终可以使用SQL Express作为数据源 - 具有真正的SQL Server的所有好处,并且仅将访问权用作前端。

答案 2 :(得分:1)

要在Access中执行此操作,您需要先将界面打开到ANSI-92 Query Mode。我已经测试了你的SQL DDL代码:它工作正常,并创建了一个FLOAT类型的列(Double)。

使用DAO是不可能的,但您可以使用ADO。长话短说:当访问团队支持ADO时,Jet 4.0时代的引擎引入了CHECK约束。从Access2007开始,Access团队又重新支持DAO,但尚未在DAO中插入Jet 4.0“漏洞”。因此,对于大多数Jet 4.0 -only功能(可压缩数据类型,固定长度文本数据类型,快速外键等),您需要使用ADO。

答案 3 :(得分:0)

您无法在查询构建器中使用标准ANSI,除非您将数据库设置为sql ansi compatible。如果您确实更改了此设置,则可以使用查询构建器中的sql。但是,我不建议更改现有数据库的此设置。

如果你这样做,你可以输入:

CREATE TABLE z1 
       (id int IDENTITY , FirstName CHAR, LastName CHAR, SSN INTEGER ,
check (id < 20),  
constraint Mypk primary key (id) )

在你不需要在查询构建器中保存sql,只想输入sql,然后只需敲击ctrl-g来获取访问命令行提示符,然后你可以输入:

currentproject.Connection.Execute "CREATE TABLE
    z1(id int IDENTITY , FirstName CHAR, LastName CHAR, SSN INTEGER ,
    check (id < 20),
    constraint Mypk primary key (id) )"

以上内容将在一行输入。因此,如果需要,可以使用命令行提示符。