代码之家  ›  专栏  ›  技术社区  ›  René Nyffenegger

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

  •  0
  • René Nyffenegger  · 技术社区  · 15 年前

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

    因此,我用access打开.mdb文件,进入查询-在设计视图中创建查询, 键入esc,然后键入menu->view->query,最后键入

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

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

    另外,我想用DAO/VBA创建约束,而不是在GUI上。有可能吗?

    最后,在一个稍微相关的注释上:如何将SQL语句输入到Access中。我无法想象我必须使用查询->设计视图->查询->查看路由才能做到这一点。我已经习惯了Oracle的SQL*PLUS,我非常喜欢它,我希望也有类似的东西可供访问。

    谢谢你的意见 雷内

    4 回复  |  直到 15 年前
        1
  •  2
  •   Fionnuala    15 年前

    这是一些注释。

    您可以为Oracle创建传递查询(选择菜单“查询”>“SQL特定”>“传递”)。

    自Access2003以来,您可以选择与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的约束。请参阅[Intermediate 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
    
        2
  •  1
  •   Dani    15 年前

    列上有验证规则。 您可以使用vb进行访问。这里没有SQL*PLUS… 您可以始终将SQL Express用作数据源—它具有实际SQL Server的所有优点,并且只将Access用作前端。

        3
  •  1
  •   onedaywhen    15 年前

    要在Access中执行此操作,需要首先将接口打开到 ANSI-92 Query Mode .我已经测试了您的SQL DDL代码:它可以正常工作并创建类型为的列 FLOAT (双份)。

    无法使用DAO执行此操作,但可以使用ADO。长话短说: CHECK 在Jet4.0时代,当访问团队倾向于ADO时,约束被引入到引擎中。从Access2007开始,访问团队回到了最喜欢的DAO,但还没有在DAO中插入Jet4.0“孔”。因此,对于大多数Jet4.0功能(可压缩数据类型、固定长度文本数据类型、快速外键等),您需要使用ADO。

        4
  •  0
  •   Albert D. Kallal    15 年前

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

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

    推荐文章