是否有可能创建访问和/或DAO检查约束?(Is it possible to create a ch

2019-09-04 00:27发布

我想创建一个访问(喷气?)表检查约束。

所以,我打开访问的.mdb文件,进入查询 - >在设计视图创建,类型ESC,然后菜单 - >查看 - >查询和查询最终输入

创建表X(一个号码,确认(a> 20))

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

此外,我想创建一个DAO / VBA的约束,而不是在GUI。 那可能吗?

最后,在一个稍微有关说明:你怎么输入SQL语句到访问。 我无法想象,我必须使用查询 - >设计视图 - >查询 - >查看路线,以做到这一点。 我习惯了Oracle的SQL * Plus,它我很喜欢,而且我希望有一个为获得类似的东西为好。

感谢您的任何输入刘若英

Answer 1:

这里有一些注意事项。

您可以创建甲骨文传递查询(选择菜单“查询”>“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的访问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


Answer 2:

上有一列验证规则。 您可以使用VB进行访问。 没有在SQL * Plus在这里......你总是可以使用SQL Express作为数据源 - 与真正的SQL Server的所有优点,并使用访问仅作为前。



Answer 3:

要做到这一点的访问,你需要先打开接口到ANSI-92查询模式 。 我测试过你的SQL DDL代码:它工作正常,并创建类型的列FLOAT (双人间)。

是不可能做到这一点使用DAO但你可以使用ADO。 长话短说: CHECK约束被引入发动机在Jet 4.0时代,当接入队是有利于ADO。 从Access2007效果,接入队又回到了有利于DAO但尚未插上DAO的Jet 4.0的“洞”。 因此,对于需要使用ADO广大的Jet 4.0 -only功能(压缩的数据类型,固定长度的文本数据类型,快速外键等)。



Answer 4:

除非你设置数据库为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) )"

以上将在一行中键入。 所以,如果你愿意,你可以使用命令行提示符下..



文章来源: Is it possible to create a check constraint in access and/or DAO?