0

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

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

创建表 X(一个数字,检查 (a > 20) )

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

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

最后,稍微相关一点:如何将 sql 语句输入到访问中。我无法想象我必须使用查询->设计视图->查询->查看路线才能做到这一点。我已经习惯了 Oracle 的 SQL*Plus,我非常喜欢它,我希望也有类似的访问方式。

感谢您的任何输入雷内

4

4 回答 4

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
于 2009-11-02T12:58:02.810 回答
1

要在 Access 中执行此操作,您需要首先将接口打开为ANSI-92 查询模式。我已经测试了您的 SQL DDL 代码:它工作正常并创建了一个类型的列FLOAT(双)。

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

于 2009-11-02T13:20:30.753 回答
1

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

于 2009-11-02T10:56:25.747 回答
0

除非您将数据库设置为与 sql ansi 兼容,否则您不能在查询生成器中使用标准 ANSI。如果您确实更改了此设置,那么您可以像以前一样使用查询生成器中的 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) )"

以上将在一行上输入。因此,您可以根据需要使用命令行提示符。

于 2009-11-02T13:30:01.723 回答