[MS SQL]外键约束

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。 


     这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。 
     首先创建用户组表: 
Sql代码  收藏代码
create table t_group (  
    id int not null,  
    name varchar(30),  
    primary key (id)  
);  




并插入两条记录: 
Sql代码  收藏代码
insert into t_group values (1, 'Group1');  
insert into t_group values (2, 'Group2');  




下面创建用户表,分别以不同的约束方式创建外键引用关系: 
1、级联(cascade)方式 
Sql代码  收藏代码
create table t_user (  
    id int not null,  
    name varchar(30),  
    groupid int,  
    primary key (id),  
    foreign key (groupid) references t_group(id) on delete cascade on update cascade  
);  




参照完整性测试 
Sql代码  收藏代码
insert into t_user values (1, 'qianxin', 1); --可以插入  
insert into t_user values (2, 'yiyu', 2);    --可以插入  
insert into t_user values (3, 'dai', 3);    --错误,无法插入,用户组3不存在,与参照完整性约束不符  




约束方式测试 
Sql代码  收藏代码
insert into t_user values (1, 'qianxin', 1);  
insert into t_user values (2, 'yiyu', 2);  
insert into t_user values (3, 'dai', 2);  
delete from t_group where id=2;              --导致t_user中的2、3记录级联删除  
update t_group set id=2 where id=1;          --导致t_user中的1记录的groupid级联修改为2  




2、置空(set null)方式 
Sql代码  收藏代码
置空方式  
create table t_user (  
    id int not null,  
    name varchar(30),  
    groupid int,  
    primary key (id),  
    foreign key (groupid) references t_group(id) on delete set null on update set null  
);  
  
参照完整性测试  
  
insert into t_user values (1, 'qianxin', 1); --可以插入  
insert into t_user values (2, 'yiyu', 2);    --可以插入  
insert into t_user values (3, 'dai', 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符  
  
约束方式测试  
insert into t_user values (1, 'qianxin', 1);  
insert into t_user values (2, 'yiyu', 2);  
insert into t_user values (3, 'dai', 2);  
delete from t_group where id=2;              --导致t_user中的2、3记录的groupid被设置为NULL  
update t_group set id=2 where id=1;          --导致t_user中的1记录的groupid被设置为NULL  






3、禁止(no action / restrict)方式 
Sql代码  收藏代码
禁止方式  
create table t_user (  
    id int not null,  
    name varchar(30),  
    groupid int,  
    primary key (id),  
    foreign key (groupid) references t_group(id) on delete no action on update no action  
);  
  
参照完整性测试  
insert into t_user values (1, 'qianxin', 1); --可以插入  
insert into t_user values (2, 'yiyu', 2);    --可以插入  
insert into t_user values (3, 'dai', 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符  
  
约束方式测试  
insert into t_user values (1, 'qianxin', 1);  
insert into t_user values (2, 'yiyu', 2);  
insert into t_user values (3, 'dai', 2);  
delete from t_group where id=2;              --错误,从表中有相关引用,因此主表中无法删除  
update t_group set id=2 where id=1;          --错误,从表中有相关引用,因此主表中无法修改 


转自:http://qianzui.iteye.com/blog/552878
展开阅读全文

ms sql

04-15

z在进行数据库连接的时候,开始时用的windows身份验证登录的,rn但是在建立连接的时候,会提示身份无效,所以我改成了模式,rn这样操作以后就能在本地数据库中直接够查询另一个数据库的数据,rn但是当我关闭数据库后再次按sql server或者windows混合身份验证登入数据库的时候rn在本地数据库中却不能操作已经创建好的的数据表,触发器等等rn老是会报错:rnrn打开表时提示诸如下的问题rn rn[color=#FF0000] 未指定的错误rn (MS Visual Database Tools)[/color]rnrn打开已建查询的时候,会提示登陆,输入用户名、密码后又弹出rn但不论选择什么,都会提示rn [color=#FF0000] 无法连接到 db2。rnrn===================================rnrn已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。) (.Net SqlClient Data Provider)[/color] rnrn打开触发器,提示rn[color=#FF0000]尝试检索对象的数据 对于 服务器“db2”失败。 (Microsoft.SqlServer.Smo)rnrn------------------------------rn有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=9.00.1399.00&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=尝试检索对象的数据+Server&LinkId=20476rnrn------------------------------[/color]rn现在都不能查看数据库中的数据,修改触发器 rn rnrn 这样的情况要怎么解决?? 论坛

一个关于SQL外键约束的问题

05-13

[code=C#]rn SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["cat"].ConnectionString);rn con.Open();rnrn DataSet dataset = new DataSet();rnrn SqlDataAdapter ac = new SqlDataAdapter("select * from child",con);rn SqlCommandBuilder bc = new SqlCommandBuilder(ac);rn ac.Fill(dataset, "child"); //子表绑定到DataSet中rnrn SqlDataAdapter ap = new SqlDataAdapter("select * from Parent", con);rn SqlCommandBuilder bp = new SqlCommandBuilder(ap);rn ap.Fill(dataset, "Parent");//父表绑定到DataSet中rnrn DataColumn parent = dataset.Tables["Parent"].Columns["ID"];rn DataColumn child = dataset.Tables["child"].Columns["ID"];rn ForeignKeyConstraint fk = new ForeignKeyConstraint("f", parent, child);rn fk.UpdateRule = Rule.Cascade;rn dataset.Tables["child"].Constraints.Add(fk);//建立约束关系rnrn dataset.Tables["Parent"].Rows[0]["ID"] = 3;//改变父表中IDrnrn ap.Update(dataset, "Parent");//更新父表rn ac.Update(dataset, "child");//更新子表rnrn foreach (DataRow d in dataset.Tables["child"].Rows)rn rn Console.WriteLine("0|1", d["ID"].ToString(), d["name"].ToString());rn //显示DataSet中子表的值rn con.Close();[/code]rn 更新子表时出错了,对于不返回任何键列信息的 SelectCommand,不支持 UpdateCommand 的动态 SQL 生成。rn 如果不更新子表那么下面的显示可以发现DataSet中的子表的ID也改变了,请问怎么能更新回数据库?父表是没问题的。在线等答案了 论坛

SQL Se关联rver外键约束

07-22

我用C++ Builder+SQL Server编一个图书管理程序,有两个问题想请教一下:rn1、我在“图书借出表”定义了一个外键:表中的“借出图书编号”值必须在“图书明细表”的“图书明细表”的“图书编号”字段中存在。代码如下:rnalter table 图书借出表rnadd constraint fkrnforeign key (借出图书编号)rnreferences 图书明细表 (图书编号)rn存成了一个.sql文件,在“查询分析器”中运行时,可以看到以下提示:rn服务器: 消息 547,级别 16,状态 1,行 1rnALTER TABLE statement conflicted with COLUMN FOREIGN KEY constraint 'fk'. The conflict occurred in database '图书管理系统', table '图书明细表', column '图书编号'.rn说明检查到了错误。rn但我在C++ Builder中用以下代码加入记录时:rntryrnrnDataModule1->ADOTable2->InsertRecord(ARRAYOFCONST((Edit2->Text,Edit1->Text,"","")));rnrn catch(...)rn rn Application->MessageBox("图书编号不存在!","输入错误",MB_OK);rn return;rn rn此约束好像没有生效,“图书明细表”的“图书编号”不存在的编号也可任意加入,系统不报错。请问是何原因?如何使约束生效?rn谢谢!rn2、我想定义阅读权限,“读者信息”和“图书明细表”中都有“部门”字段,某个读者登录后只能查阅“图书明细表”中 “部门”值与“读者信息”表中“部门”相等的记录,请问如何实现?谢谢!rnrn 论坛

ASP.NET连接数据库MS SQL

06-26

http://blog.csdn.net/j2ee_ren/archive/2007/06/26/1666455.aspxrn很郁闷,弄了好长时间也没连接上sql,不知道是什么原因:rnrn下面是代码rnrn先包含命名空间:rnrnusing System.Data;rnusing System.Data.SqlClient;rnrn再在page_load里写入下面的代码:rnrn string strConn="data source=localhost;Initial Catalog=northwind;User Id=sa;Pwd=mssqlfs;Integrated Security=SSPI";rn SqlConnection sqlConn=new SqlConnection();rn sqlConn.ConnectionString=strConn;rn sqlConn.Open();rnrn Label1.Text="数据源:"+sqlConn.DataSource+" "+rn "数据库:"+sqlConn.Database+" "+rn "当前状态:"+sqlConn.State;rnrn sqlConn.Close();rnrn这可是看着书上的例程写的,应该没错了.但是,每次打开都是错误.rnrn说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 rnrn异常详细信息: System.Data.SqlClient.SqlException: SQL Server 不存在或访问被拒绝。rnrn源错误: rnrn行 30: SqlConnection sqlConn=new SqlConnection();行 31: sqlConn.ConnectionString=strConn;行 32: sqlConn.Open();行 33: 行 34: Label1.Text="数据源:"+sqlConn.DataSource+" "+rn rnrn源文件: e:\developor\ing\vvv\dotnettest\database\sqlconn.aspx.cs 行: 32 rnrn堆栈跟踪: rnrn[SqlException: SQL Server 不存在或访问被拒绝。] System.Data.SqlClient.SqlConnection.Open() +761 DotNetTest.database.sqlconn.Page_Load(Object sender, EventArgs e) in e:\developor\ing\vvv\dotnettest\database\sqlconn.aspx.cs:32 System.Web.UI.Control.OnLoad(EventArgs e) +67 System.Web.UI.Control.LoadRecursive() +29 System.Web.UI.Page.ProcessRequestMain() +724rn rnrnrnrn“/DotNetTest”应用程序中的服务器错误。 rn--------------------------------------------------------------------------------rnrnSQL Server 不存在或访问被拒绝。 rn rnrnrn--------------------------------------------------------------------------------rnrn版本信息: Microsoft .NET 框架版本:1.0.3705.0; ASP.NET 版本:1.0.3705.0 rnrn我的sql是8.0版本的,sql本机服务器的注册属性里,采用的是windows身份验证;安全性里的身份验证是sql server和windows.(这些都是看往山写的,改的.)rnrn哎呀,真不知道怎么弄了.rnrn大侠帮忙rn 论坛

没有更多推荐了,返回首页