ACCESS中如何定义一个表的外键

解决方案 »

  1.   

    MS Jet SQL for Access 2000改变数据表
    在建立或倒入一个数据表之后,用户可能需要修改表的设计。这时就可以使用ALTER TABLE语句。但是注意,改变现存的表的结构可能会导致用户丢失一些数据。比如,改变一个域的数据类型将导致数据丢失或舍入错误,这取决于用户现在使用的数据类型。改变数据表也可能会破坏用户的应用程序中涉及到所改变的域的部分。所以用户在修改现有表的结构之前一定要格外小心。使用ALTER TABLE 语句,用户可以增加,删除或改变列或域,也可以增加或删除一个约束。还可以为某个域设定缺省值,但是一次只能修改一个域。假设我们有一个记账单的数据库,而我们想在顾客数据表中增加一个域,这时可以使用ALTER TABLE 语句,在其ADD COLUMN 子句后写上域的名称、数据类型和数据的大小(如果需要的话)。ALTER TABLE tblCustomers
    ADD COLUMN Address TEXT(30)
    要改变域的数据类型或大小,可以使用ALTER COLUMN子句,在后面加上期望的数据类型和数据的大小。ALTER TABLE tblCustomers
    ALTER COLUMN Address TEXT(40)
    如果需要改变域的名称,则必须删除该域并重新创建。删除一个域要使用DROP COLUMN 子句,在其后跟上域的名称。ALTER TABLE tblCustomers
    DROP COLUMN Address
    注意使用这种方法将会删除该域的现存数据。如果需要保存这些数据,则用户需要在Access的用户界面的设计模式中改变该域的名称,或者编写代码将现存的数据保存在一个临时的表中然后将其添加到改名后的表中。缺省值是指在表中增加新纪录并且没有为该列赋值时自动填充到该域中的值。为某域设置缺省值,要在定义域的类型后使用使用DEFAULT关键字,不管是使用ADD COLUMN或 ALTER COLUMN 子句。ALTER TABLE tblCustomers
    ALTER COLUMN Address TEXT(40) DEFAULT Unknown
    注意缺省值并不使用单引号包含,如果用了单引号,则引号也会插入到记录中。在CREATE TABLE语句中也可以使用DEFAULT关键字。CREATE TABLE tblCustomers (
    CustomerID INTEGER CONSTRAINT PK_tblCustomers
    PRIMARY KEY, 
    [Last Name] TEXT(50) NOT NULL,
    [First Name] TEXT(50) NOT NULL,
    Phone TEXT(10),
    Email TEXT(50),
    Address TEXT(40) DEFAULT Unknown)
    注意: DEFAULT 语句只有在Jet OLE DB provider和ADO中可以执行,在Access SQL View的用户界面中使用将会返回错误信息。下面的部分将讨论如何在ALTER TABLE语句中使用约束。要获得更详细的有关ALTER TABLE的说明,请在Office 助手中或在Microsoft Access 帮助的回答向导的标签页中输入ALTER TABLE ,然后单击查找。约束
    在《Access 2000的基础Microsoft Jet SQL》一文中,我们讨论了建立表之间的联系的约束方法。约束也能用于建立主键和参考完整性,来限制插入到一个域中的数据值。通常,约束可以用于保持用户数据库中的数据完整性和一致性。共有两种类型的约束:单数据域(或称域级的)的约束和多数据域(或称表级的)的约束。两种约束都可以用在CREATE TABLE 或 ALTER TABLE 语句中。单域的约束,也就是通常所说的列级的约束,是在域及其数据类型定义后针对该域定义的。下面我们使用用户表,在CustomerID域生成一个单域的主键。增加约束时,在域名后使用CONSTRAINT关键字。ALTER TABLE tblCustomers
    ALTER COLUMN CustomerID INTEGER
    CONSTRAINT PK_tblCustomers PRIMARY KEY
    注意这里给出了约束的名称。用户还可以在定义主键时使用简称而省略CONSTRAINT子句。ALTER TABLE tblCustomers
    ALTER COLUMN CustomerID INTEGER PRIMARY KEY
    然而,使用简称的方法将导致Access随机的生成约束的名称,从而使得在代码中难以引用。所以,最好给约束制定名称。要删除一个约束,可以在ALTER TABLE 语句中使用DROP CONSTRAINT 子句,并给出约束的名称。ALTER TABLE tblCustomers
    DROP CONSTRAINT PK_tblCustomers
    约束还可以用来给域限制允许值。用户可以将限制值设为非空(NOT NULL)或唯一( UNIQUE),或者定义一个检验性的约束,该约束指一种可以应用于某个域的规则。比如用户希望限制姓和名的域是唯一的,就意味着在表中永远不会有两个相同姓名的记录存在。这是因为这种约束是多域的性的,是在表的级别定义的,而非域的级别。使用ADD CONSTRAINT子句可以定义一个多域的列表。ALTER TABLE tblCustomers
    ADD CONSTRAINT CustomerNames UNIQUE
    ([Last Name], [First Name])
    注意: 我们在这里只是示范一下如何使用约束,而在实际的应用程序中,用户可能并不希望彻底限制姓名的唯一性。检验性约束是一种新的强有力的SQL特性,它通过一个表达式从而允许用户在表中添加数据合法性检验,该表达式可以指向一个单域,也可以指向跨越一个或多个表的多个域。比如用户希望确定输入到发票记录中的数值是否总是大于0,则可以在ALTER TABLE语句的ADD CONSTRAINT子句中定义一个CHECK关键字。ALTER TABLE tblInvoices
    ADD CONSTRAINT CheckAmount
    CHECK (Amount > 0)
    注意: 检验性约束语句只能通过Jet OLE DB provider和ADO来执行,在Access SQL View的用户界面中使用将返回错误信息。而且,要删除一个检验性约束,也必须在Jet OLE DB provider 和ADO中执行DROP CONSTRAINT语句。另外,如果用户已经定义了一个检验性约束: (1) 在Access的用户界面中并不会显示为一个合法性规则,(2) 用户也不能在该界面中定义合法性文本的属性,否则将给出一般性错误信息,(3) 在用户通过ADO使用DROP CONSTRAINT语句之前,不能够通过Access的用户界面或者在代码中删除数据表。用来定义一个检验性约束的表达式也可以用来指向同一个表中的多个域,甚至是其他表中的域。其中可以使用任何在Microsoft Jet SQL 中合法的操作符,比如SELECT 语句、数学运算符、以及集合函数等。用来定义检验性约束的表达式的长度不能超过64个字符。设想用户希望在将顾客加入到Customers 表之前检查每个顾客的信用额度。则可以使用带有ADD COLUMN 和CONSTRAINT 子句的ALTER TABLE 语句生成一个约束,该约束将查找在CreditLimit表中的值来验证顾客的信用额度。下面的SQL语句将生成一个tblCreditLimit 表,然后将CustomerLimit域加入到tblCustomers 表中,并将检验性约束加到tblCustomers表,最后对该检验性约束进行测试。CREATE TABLE tblCreditLimit (
    Limit DOUBLE)
    INSERT INTO tblCreditLimit
    VALUES (100)
    ALTER TABLE tblCustomers
    ADD COLUMN CustomerLimit DOUBLE
    ALTER TABLE tblCustomers
    ADD CONSTRAINT LimitRule
    CHECK (CustomerLimit <= (SELECT Limit
    FROM tblCreditLimit))
    UPDATE TABLE tblCustomers
    SET CustomerLimit = 200
    WHERE CustomerID = 1
    注意:当用户执行UPDATE TABLE语句时,将被提示更新失败,因为该语句违反了检验性约束。如果用户使用小于等于100的值来更新CustomerLimit域,就能够成功。
      

  2.   

    注意WITH COMPRESSION 和WITH COMP关键字要在NOT NULL之前定义。用户也可以使用ALTER TABLE语句改变现存域的双字节编码的压缩属性,如下所示:ALTER TABLE tblCustomers
    ALTER COLUMN [Last Name] TEXT(50) WITH COMPRESSION
    注意: 在上面的SQL语句中列示的WITH COMPRESSION and WITH COMP关键字只能通过Jet OLE DB provider 和ADO来执行,在Access SQL View的用户界面中使用将导致错误信息。在用户设计数据表时采取那种数据类型取决于用户的应用程序的目的。如果该应用程序总是应用在Jet数据库的基础上,则应该使用最适宜的那些数据类型。但如果该应用程序最终要用到ODBC-compliant的数据库上,比如SQL Server 或 MSDE,则要使用那些是一致最方便的数据类型。
    数字( NUMERIC)数据类型
    数字(NUMERIC)数据类型是用来定义存储计算用数字的域的。通常,将某种NUMERIC类型与其他的区别开来的是用来存储数据的字节数,它也影响着所存储数字的精度。许多Jet SQL 的数据类型豆油协同义字可以用来进行定义,到底使用哪一个取决于该数据表是仅在某个Jet数据库中还是将移植到诸如Microsoft SQL Server的数据库服务器中。如果将进行移植,用户应选择那些使得移植最容易进行的数据类型。下面的表格列示了基本的Jet NUMERIC数据类型,它的各种同义字以及为期分配的字节数。Jet 数据类型
    同义字
    存储大小TINYINT
    INTEGER1, BYTE
    1 byteSMALLINT
    SHORT, INTEGER2
    2 bytesINTEGER
    LONG, INT, INTEGER4
    4 bytesREAL
    SINGLE, FLOAT4, IEEESINGLE
    4 bytesFLOAT
    DOUBLE, FLOAT8, IEEEDOUBLE, NUMBER
    8 bytesDECIMAL
    NUMERIC, DEC
    17 bytes
    下面的CREATE TABLE 语句示范了各种可以在通过Access SQL View 的用户界面创建表时使用的SNUMERIC 数据类型。CREATE TABLE tblUINumericDataTypes (
    Field1_INT INT,
    Field2_INTEGER INTEGER,
    Field3_LONG LONG,
    Field4_INTEGER1 INTEGER1,
    Field5_BYTE BYTE,
    Field6_NUMERIC NUMERIC,
    Field7_REAL REAL,
    Field8_SINGLE SINGLE,
    Field9_FLOAT FLOAT,
    Field10_FLOAT4 FLOAT4,
    Field11_FLOAT8 FLOAT8,
    Field12_DOUBLE DOUBLE,
    Field13_IEEESINGLE IEEESINGLE,
    Field14_IEEEDOUBLE IEEEDOUBLE,
    Field15_NUMBER NUMBER,
    Field16_SMALLINT SMALLINT,
    Field17_SHORT SHORT,
    Field18_INTEGER2 INTEGER2,
    Field19_INTEGER4 INTEGER4)
    虽然上面的SQL 语句也可以通过Jet OLE DB provider 和ADO来执行,仍有一些其他的NUMERIC 数据类型的形式只能通过Jet OLE DB provider 和 ADO来执行。CREATE TABLE tblCodeNumericDataTypes (
    Field1_TINYINT TINYINT,
    Field2_DECIMAL DECIMAL,
    Field3_DEC DECIMAL,
    Field4_DPRECISION DOUBLE PRECISION)
    注意: 上面的SQL 语句中的数据类型只能通过Jet OLE DB provider 和 ADO来执行,在Access SQL View的用户界面中使用将导致错误信息。还要注意如果通过Access SQL View 建立了一个NUMERIC 数据类型的域,通过Access 用户界面察看表的设计时看到的将是DOUBLE 数据类型,但是如果通过Jet OLE DB provider 和 ADO建立NUMERIC数据类型,通过Access 用户界面看到的将是DECIMAL数据类型.使用新的DECIMAL 数据类型,用户可以设定数值的精度和小数位。精度就是该域所能包含的数字的总数,而小数位则决定了小数点右面能有几位数字,精度缺省值是18,最大的允许值28,而小数位缺省的是0,最大值时28。CREATE TABLE tblDecimalDataTypes (
    DefaultType DECIMAL,
    SpecificType DECIMAL(10,5))
    货币(CURRENCY)数据类型
    货币(CURRENCY)数据类型是用来存储15位整数和4位小数的数字值的,它使用8个字节的存储量,其唯一的同义字是MONEY。下面的CREATE TABLE 语句示范了CURRENCY 数据类型在创建数据表时的用法,它既可以在Access SQL View 用户界面中也可以在Jet OLE DB provider 和 ADO中使用。CREATE TABLE tblCurrencyDataTypes (
    Field1_CURRENCY CURRENCY,
    Field2_MONEY MONEY)
    是否(BOOLEAN )数据类型是否(BOOLEAN)是逻辑数据类型,其值为是(TRUE)或否(FALSE)。它们使用一个字节的存储量,同义字有BIT、 LOGICAL、 LOGICAL1 和 YESNO。 True的值等于–1, False的值等于0。下面的CREATE TABLE 语句示范了通过Jet OLE DB provider 和 ADO 来创建BOOLEAN 数据类型的不同形式。