當前位置:首頁 » 編程語言 » sql主鍵外鍵和非空的約束
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql主鍵外鍵和非空的約束

發布時間: 2023-02-12 08:01:29

1. sql Server 2008中包含哪些約束這些約束如何實現數據完整性

唯一約束,非空約束,默認值約束,check約束,主外鍵約束
唯一約束保證數據不重復
非空約束保證數據不為null值
默認值約束保證數據一定有值
check約束保證數據滿足驗證條件
主外鍵約束保證主從表數據一致

2. SQL完整性約束條件中的主鍵、外鍵約束是什麼意思

主鍵約束是指能唯一標識一個實體(一條記錄)的鍵,不能重復為空,一般是主鍵。我們常見的有身份證號碼,學生證的學號等,這些都是為了能在一個環境中唯一的確定一個人的標識。外鍵是指一個實體(一條記錄)引用的其他實體必須是存在的,常見的例子是:學生和他對應的班級,學生實體在資料庫中的記錄要引用班級實體在資料庫中記錄的主鍵作為外鍵,加入學生甲是二年級三班的學生,那麼這個二年級三班必須是存在的,如果不存在,學生甲就不能引用這個班級。

3. sql的主鍵和外鍵怎麼設

一、主鍵是能確定一條記錄的唯一標識,比如,一條記錄包括身份正號,姓名,年齡。身份證號是唯一能確定你這個人的,其他都可能有重復,所以,身份證號是主鍵。
外鍵用於與另一張表的關聯。是能確定另一張表記錄的欄位,用於保持數據的一致性。比如,A表中的一個欄位,是B表的主鍵,那他就可以是A表的外鍵。
主鍵和外鍵約束的方法:
create table Student --建表格式:create table 自定義的表名
( --欄位名一般為有一定意義的英文
StudentName nvarchar(15), -- 格式:欄位名類型()括弧裡面的是允許輸入的長度
StudentAge int, --int型的後面不需要接長度
StudentSex nvarchar(2) --最後一個欄位後面不要逗號
)
--在創建表時就可以對欄位加上約束:
create table Student
(
StudentNo int PRIMARY KEY IDENTITY(1,1), --加主鍵約束,還有標識列屬性(兩者構成實體完整性)
StudentName nvarchar(15) not null, --加非空約束,不加"not null" 默認為:可以為空
StudentSchool text(20) FOREIGN KEY REFERENCES SchoolTable(SchoolName), --加外鍵約束,格式:FOREIGN KEY REFERENCES 關聯的表名(欄位名)
StudentAge int DEFAULT ((0)), --加默認值約束
StudentSex nvarchar(2) CHECK(StudentSex=N'男' or StudentSex=N'女') --加檢查約束,格式:check (條件表達式)
)
--如果在表創建好了以後再加約束,則格式分別為:
-- 主鍵:
alter table 表名
add constraint PK_欄位名--"PK"為主鍵的縮寫,欄位名為要在其上創建主鍵的欄位名,'PK_欄位名'就為約束名
primary key (欄位名) --欄位名同
--唯一約束:
alter table 表名
add constraint UQ_欄位名
unique (欄位名
--外鍵約束:
alter table 表名
add constraint FK_欄位名--"FK"為外鍵的縮寫
foreign key (欄位名) references 關聯的表名(關聯的欄位名) --注意'關聯的表名'和'關聯的欄位名'
alter table 表A add constraint FK_B foreign key (ticket_no) references 表B(ticket_no)
alter table 表A add constraint FK_C foreign key (person_no) references 表C(person_no)
alter table 成績表 add constraint FK_StudentNo foreign key (StudentNo) references Student(StudentNo)
ON UPDATE CASCADE ON DELETE CASCADE
級聯更新,級聯刪除,這樣在刪除主表Student時,成績表中該學生的所有成績都會刪除。
--檢查約束:
alter table 表名
add constraint CK_欄位名
check (條件表達式) --條件表達式中的條件用關系運算符連接
--默認值約束:
alter table 表名
add constraint DF_欄位名
default '默認值' for 欄位名--其中的'默認值'為你想要默認的值,注意'for'
--刪除創建的約束:
alter table 表名
drop constraint 約束名--約束名為你前面創建的如:PK_欄位這樣的約束名
--注意:如果約束是在創建表的時候創建的,則不能用命令刪除
--只能在'企業管理器'裡面刪除
-- 獲取SqlServer中表結構
SELECT syscolumns.name,systypes.name,syscolumns.isnullable,
syscolumns.length
FROM syscolumns,systypes
WHERE syscolumns.xusertype = systypes.xusertype
AND syscolumns.id = OBJECT_ID('Student')
-- 單獨查詢表遞增欄位
SELECT [name] FROM syscolumns WHERE
id = OBJECT_ID(N'Student') AND COLUMNPROPERTY(id,name,'IsIdentity')=1
-- 獲取表主外鍵約束
EXEC sp_helpconstraint 'StuResults'
-- 查詢表主鍵外鍵信息
SELECT sysobjects.id objectId,OBJECT_NAME(sysobjects.parent_obj) tableName,
sysobjects.name constraintName, sysobjects.xtype AS constraintType,
syscolumns.name AS columnName
FROM sysobjects INNER JOIN sysconstraints
ON sysobjects.xtype in('C', 'F', 'PK', 'UQ', 'D')
AND sysobjects.id = sysconstraints.constid
LEFT OUTER JOIN syscolumns ON sysconstraints.id = syscolumns.id
WHERE OBJECT_NAME(sysobjects.parent_obj)='StuResults'

4. sql中表達完整性約束的機制主要有哪幾種

在SQL中,表達完整性約束的規則有主鍵約束、外鍵約束、屬性值約束和全局約束等多種形式。
(1)主鍵約束:可用主鍵子句或主鍵短語來定義。
如 PRIMARY KEY (S#) (主鍵子句)
S# CHAR (4) PRIMARY KEY (其中,PRIMARY KEY 為主鍵短語)
(2)外鍵約束:可用外鍵子句來定義
如 FOREIGN KEY (S#) REFERNCE S(S#)

(3)屬性值約束:包括非空值約束(NOT NULL);基於屬性的檢查子句(CHECK) ;
域約束子句(在「CREAT DOMAIN」語句中出現CHECK子句)
如CREAT DOMAIN AGE SMALLINT CHECK (VALUE>10)
(4)全局約束:包括基於元組的檢查子句(CHECK)和斷言
斷言的句法為:CREATE ASSERTION 斷言名 CHECK 條件

5. 資料庫之主鍵外鍵

1,主鍵約束 (table的唯一標識)

能夠作為主鍵列的特點:該列不能為空,不能有重復值出現

創建表時指定主鍵的兩種方式:

CREATE TABLE stu(

sid CHAR(6) PRIMATY KEY,

sname VARCHAR(20),

age INT,

gender VARCHER(10)

);

指定sid列為主鍵列

CREATE TABLE stu(

sid CHAR(6),

sname VARCHAR(20),

age INT,

gender VARCHER(10),

PRIMARY KEY(sid)

);

指定sid列為主鍵列

修改表時指定主鍵:ALTER TABLE stu ADD PRIMATY KEY(sid);

刪除主鍵:ALTER TABLE stu DROP PRIMARY KEY;

2,主鍵自增長

因為主鍵列的特性是:必須唯一,不能為空,所以我們通常會指定主鍵為整形,然後設置其自動增長

創建表時指定主鍵自增長:

CREATE TABLE stu(

sid INT PRIMARY KEY AUTO_INCREMENT,

sname VARCHAR(20),

age INT,

gender VARCHAR(10)

);

修改表時設置主鍵自增長:ALTER TABLE stu 

3,非空約束

CREATE TABLE stu(

sid INT PRIMARY KEY AUTO_INCREMENT,

sname VARCHAR(20) NOT NULL,

age INT,

gender VARCHAR(10)

);

對sname列設置了非空約束

4,唯一約束

某些列不能設置重復的值,所以可以對列添加唯一約束

CREATE TABLE stu(

sid INT PRIMARY KEY AUTO_INCREMENT,

sname VARCHAR(20) NOT NULL UNIQUE,

age INT,

gender VARCHAR(10)

);

6,外鍵約束

外鍵特點:外鍵必須是另一個表的主鍵的值(外鍵要引用主鍵!),外鍵可以重復,外鍵可以為空,一張表可以有多個外鍵!

CREATE TABLE dept( //部門表

deptno INT  PRIMARY KEY AUTO_INCREMENT,

deptname CHAR(20)

);

INSERT INTO dept VALUES(10,『研發部』);

INSERT INTO dept VALUES(20,『人力部』);

INSERT INTO dept VALUES(30,『財務部』);

CREATE TABLE emp(   //員工表

empno INT PRIMARY KEY AUTO_INCREMENT,

ename VARCHAR(50),

dno INT, //員工所屬部門(外鍵),

CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno)

);

INSERT INTO emp(empno,ename)  VALUES(NULL,『張三』),//外鍵可以不傳入值

INSERT INTO emp(empno,ename)  VALUES(NULL,『李四』,10),//外鍵可以重復

INSERT INTO emp(empno,ename)  VALUES(NULL,『王五』,10),

INSERT INTO emp(empno,ename)  VALUES(NULL,『趙六』,80),//dept表沒有主鍵值為80的記錄,sql客戶端編譯報錯

7,一對一關系模型

創建老公表

CREATE TABLE hashand(

hid INT PRIMARY KEY AUTO_INCREMENT,

hname VARCHAR(50),

);

INSERT INTO hashand VALUES(NULL,『劉備』);

INSERT INTO hashand VALUES(NULL,『關羽』);

INSERT INTO hashand VALUES(NULL,『張飛』);

SELECT * FROM hashand

//創建老婆表

CREATE TABLE wife(

wid INT PRIMARY KEY AUTO_INCREMENT,

wname VARCHAR(50),

CONSTRAINT fk_wife_hashand FOREIGN KEY(wid)  REFERENCES hashand(hid)

)

/**

wid:

1,非空

2,唯一

3,引用hid

*/

INSERT INTO wife VALUES(1,『楊貴妃』);

INSERT INTO wife VALUES(2,『妲己』);

INSERT INTO wife VALUES(3,『褒姒』);

SELECT * FROM wife;

對於一對一關系模型從表的主鍵即是外鍵,例如老公和老婆的關系模型,一個老公只能有一個老婆,一個老婆只能有一個老公

對於一對多關系模型主表的主鍵即是從表的外鍵,例如訂單和用戶的關系模型,一個用戶可以下單多次,對應多個訂單,而一個訂單只能屬於一個用戶

對於多對多關系模型沒有主表和從表之分,需要建立第三張表來記錄這兩張表的外鍵,建立兩個外鍵,分別引用這兩張表的主鍵

8,多對多關系模型

在表中簡歷多對多關系需要使用中間表,即需要三張表,在中間表中使用兩個外鍵,分別引用其他兩個表的主鍵,例如學生和老師的關系模型,一個老師可以有多個學生,一個學生可以有多個老師

CREATE TABLE student(

sid INT PRIMARY KEY AUTO_INCREMENT,

sname CHAR(40)

);

CREATE TABLE teacher(

tid INT PRIMARY KEY AUTO_INCREMENT,

tname CHAR(40)

);

CREATE TABLE stu_tea(

sid INT,

tid INT,

ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),

ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)

);

INSERT INTO student VALUES(NULL,『劉德華』);

INSERT INTO student VALUES(NULL,『梁朝偉』);

INSERT INTO student VALUES(NULL,『黃日華』);

INSERT INTO student VALUES(NULL,『苗僑偉』);

INSERT INTO student VALUES(NULL,『湯鎮業』);

INSERT INTO teacher VALUES(NULL,『崔老師』);

INSERT INTO teacher VALUES(NULL,『劉老師』);

INSERT INTO teacher VALUES(NULL,『石老師』);

SELECT * FROM student;

SELECT * FROM teacher;

INSERT INTO stu_tea VALUES(1,1); //劉德華是崔老師的學生

INSERT INTO stu_tea VALUES(2,1); //梁朝偉是崔老師的學生

INSERT INTO stu_tea VALUES(3,1);//黃日華是崔老師的學生

INSERT INTO stu_tea VALUES(4,1);//苗僑偉是崔老師的學生

INSERT INTO stu_tea VALUES(5,1);//湯鎮業是崔老師的學生

INSERT INTO stu_tea VALUES(2,2);//梁朝偉是劉老師的學生

INSERT INTO stu_tea VALUES(3,2);//黃日華是劉老師的學生

INSERT INTO stu_tea VALUES(4,2);//苗僑偉是劉老師的學生

INSERT INTO stu_tea VALUES(3,3);//黃日華是石老師的學生

INSERT INTO stu_tea VALUES(5,3);//湯鎮業是劉老師的學生

SELECT * FROM stu_tea;

這時在stu_tea這個中間表中的每條記錄都是來說明student表和teacher表的關系的

例如在stu_tea表中的記錄:sid為1001,tid為2001,這說明編號為1001的學生有一個編號為2001的老師

sid          tid

1001       2001 //編號為1001的學生有一個編號為2001的老師

1001       2002 //編號為1001的學生有一個編號為2002的老師

1001       2003 //編號為1001的學生有一個編號為2003的老師

1002       2001 //編號為2001的老師有一個編號為1002的學生

1002       2004 //編號為2004的老師有一個編號為1002的學生

9,合並結果集

要求要合並的結果集中,列的類型和列數相同

UNION,去除重復行,UNION ALL,不去除重復行

6. 怎樣用SQL語句對指定欄位建立非空約束

五大約束
1.—-主鍵約束(Primay Key Coustraint) 唯一性,非空性
2.—-唯一約束 (Unique Counstraint)唯一性,可以空,但只能有一個
3.—-檢查約束 (Check Counstraint) 對該列數據的范圍、格式的限制(如:年齡、性別等)
4.—-默認約束 (Default Counstraint) 該數據的默認值
5.—-外鍵約束 (Foreign Key Counstraint) 需要建立兩表間的關系並引用主表的列五大約束的語法示例
1.—-添加主鍵約束(將stuNo作為主鍵)
alter table stuInfo
add constraint PK_stuNo primary key (stuNo)
2.—-添加唯一約束(身份證號唯一,因為每個人的都不一樣)
alter table stuInfo
add constraint UQ_stuID unique(stuID)
3.—-添加默認約束(如果地址不填 默認為「地址不詳」)
alter table stuInfo
add constraint DF_stuAddress default (『地址不詳』) for stuAddress
4.—-添加檢查約束 (對年齡加以限定 15-40歲之間)
alter table stuInfo
add constraint CK_stuAge check (stuAge between 15 and 40)
alter table stuInfo
add constraint CK_stuSex check (stuSex=』男』 or stuSex=』女′)
5.—-添加外鍵約束 (主表stuInfo和從表stuMarks建立關系,關聯欄位stuNo)
alter table stuInfo
add constraint FK_stuNo foreign key(stuNo)references stuinfo(stuNo)
約束(Constraint)是Microsoft SQL Server 提供的自動保持資料庫完整性的一種方法,定義了可輸入表或表的單個列中的數據的限制條件(有關數據完整性的介紹請參見第9 章)。在SQL Server 中有5 種約束:主關鍵字約束(Primary Key Constraint)、外關鍵字約束(Foreign Key Constraint)、惟一性約束(Unique Constraint)、檢查約束(Check Constraint)和預設約束(Default Constraint)。
1 主關鍵字約束
主關鍵字約束指定表的一列或幾列的組合的值在表中具有惟一性,即能惟一地指定一行記錄。每個表中只能有一列被指定為主關鍵字,且IMAGE 和TEXT 類型的列不能被指定為主關鍵字,也不允許指定主關鍵字列有NULL 屬性。
定義主關鍵字約束的語法如下:
CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])
各參數說明如下:
constraint_name
指定約束的名稱約束的名稱。在資料庫中應是惟一的。如果不指定,則系統會自動生成一個約束名。
CLUSTERED | NONCLUSTERED
指定索引類別,CLUSTERED 為預設值。其具體信息請參見下一章。
column_name
指定組成主關鍵字的列名。主關鍵字最多由16 個列組成。
例7-3: 創建一個產品信息表,以產品編號和名稱為主關鍵字
create table procts (
p_id char(8) not null,
p_name char(10) not null ,
price money default 0.01 ,
quantity smallint null ,
constraint pk_p_id primary key (p_id, p_name)
) on [primary]
2 外關鍵字約束
外關鍵字約束定義了表之間的關系。當一個表中的一個列或多個列的組合和其它表中的主關鍵字定義相同時,就可以將這些列或列的組合定義為外關鍵字,並設定它適合哪個表中哪些列相關聯。這樣,當在定義主關鍵字約束的表中更新列值,時其它表中有與之相關聯的外關鍵字約束的表中的外關鍵字列也將被相應地做相同的更新。外關鍵字約束的作用還體現在,當向含有外關鍵字的表插入數據時,如果與之相關聯的表的列中無與插入的外關鍵字列值相同的值時,系統會拒絕插入數據。與主關鍵字相同,不能使用一個定義為 TEXT 或IMAGE 數據類型的列創建外關鍵字。外關鍵字最多由16 個列組成。
定義外關鍵字約束的語法如下:
CONSTRAINT constraint_name
FOREIGN KEY (column_name1[, column_name2,…,column_name16])
REFERENCES ref_table [ (ref_column1[,ref_column2,…, ref_column16] )]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ] ]
[ NOT FOR REPLICATION ]
各參數說明如下:
REFERENCES
指定要建立關聯的表的信息。
ref_table
指定要建立關聯的表的名稱。
ref_column
指定要建立關聯的表中的相關列的名稱。
ON DELETE {CASCADE | NO ACTION}
指定在刪除表中數據時,對關聯表所做的相關操作。在子表中有數據行與父表中的對應數據行相關聯的情況下,如果指定了值CASCADE,則在刪除父表數據行時會將子表中對應的數據行刪除;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,並將父表中的刪除操作回滾。NO ACTION 是預設值。
ON UPDATE {CASCADE | NO ACTION}
指定在更新表中數據時,對關聯表所做的相關操作。在子表中有數據行與父表中的對應數據行相關聯的情況下,如果指定了值CASCADE,則在更新父表數據行時會將子表中對應的數據行更新;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,並將父表中的更新操作回滾。NO ACTION 是預設值。
NOT FOR REPLICATION
指定列的外關鍵字約束在把從其它表中復制的數據插入到表中時不發生作用。
例7-4:創建一個訂貨表,與前面創建的產品表相關聯
create table orders(
order_id char(8),
p_id char(8),
p_name char(10) ,
constraint pk_order_id primary key (order_id) ,
foreign key(p_id, p_name) references procts(p_id, p_name)
) on [primary]
注意:臨時表不能指定外關鍵字約束。
惟一性約束
惟一性約束指定一個或多個列的組合的值具有惟一性,以防止在列中輸入重復的值。惟一性約束指定的列可以有NULL 屬性。由於主關鍵字值是具有惟一性的,因此主關鍵字列不能再設定惟一性約束。惟一性約束最多由16 個列組成。
定義惟一性約束的語法如下:
CONSTRAINT constraint_name
UNIQUE [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])
例7-5:定義一個員工信息表,其中員工的身份證號具有惟一性。
create table employees (
emp_id char(8),
emp_name char(10) ,
emp_cardid char(18),
constraint pk_emp_id primary key (emp_id),
constraint uk_emp_cardid unique (emp_cardid)
) on [primary]
7.2.4 檢查約束
檢查約束對輸入列或整個表中的值設置檢查條件,以限制輸入值,保證資料庫的數據完整性。可以對每個列設置符合檢查。
定義檢查約束的語法如下:
CONSTRAINT constraint_name
CHECK [NOT FOR REPLICATION]
(logical_expression)
各參數說明如下:
NOT FOR REPLICATION
指定檢查約束在把從其它表中復制的數據插入到表中時不發生作用。
logical_expression
指定邏輯條件表達式返回值為TRUE 或FALSE。
例7-6: 創建一個訂貨表其中定貨量必須不小於10。
create table orders(
order_id char(8),
p_id char(8),
p_name char(10) ,
quantity smallint,
constraint pk_order_id primary key (order_id),
constraint chk_quantity check (quantity>=10) ,
) on [primary]
注意:對計算列不能作除檢查約束外的任何約束。
7.2.5 預設約束
預設約束通過定義列的預設值或使用資料庫的預設值對象綁定表的列,來指定列的預設值。SQL Server 推薦使用預設約束,而不使用定義預設值的方式來指定列的預設值。有關綁定預設約束的方法請參見「數據完整性」章節。
定義預設約束的語法如下:
CONSTRAINT constraint_name
DEFAULT constant_expression [FOR column_name]
例7-7:
constraint de_order_quantity default 100 for order_quantity
注意:不能在創建表時定義預設約束,只能向已經創建好的表中添加預設約束。
7.2.6 列約束和表約束
對於資料庫來說,約束又分為列約束(Column Constraint)和表約束(Table Constraint)。
列約束作為列定義的一部分只作用於此列本身。表約束作為表定義的一部分,可以作用於
多個列。
下面舉例說明列約束與表約束的區別。
例7-8:
create table procts (
p_id char(8) ,
p_name char(10) ,
price money default 0.01 ,
quantity smallint check (quantity>=10) , /* 列約束 */
constraint pk_p_id primary key (p_id, p_name) /* 表約束 */

7. 主鍵和外鍵的作用

主鍵和外鍵的作用:

1、保證實體的完整性,加快資料庫操作速度,在表中添加記錄時,access會自動檢查新記錄主鍵值,不允許該值與主鍵值重復。access會自動按主鍵值排序好的顯示出來。如果沒有約束,則是按照用戶輸入信息的順序顯示出來。主鍵不接受空值,約束確保唯一數據。

2、外鍵保證的是數據的完整性。外鍵:一組數據的主鍵是另一組數據的的元素;主鍵約束了外鍵所在表中不能存在主鍵類之外的值;外鍵用於與另一張表的關聯。是能確定另一張表記錄的欄位,用於保持數據的一致性。比如,A表中的一個欄位,是B表的主鍵,就可以是A表的外鍵。

(7)sql主鍵外鍵和非空的約束擴展閱讀:

主鍵和外鍵的注意事項:

1、主鍵默認非空,默認唯一性約束,只有主鍵才能設置自動增長,自動增長一定是主鍵,主鍵不一定自動增長;

設置主鍵的方式:在定義列時設置:ID INT PRIMARY KEY;在列定義完之後設置:primary KEY(id)、

2、只有INNODB的資料庫引擎支持外鍵,修改my.ini文件設置default-storage-engine=INNODB 外鍵必須與參照列的數據類型必須相同(數值型要求長度和無符號都相同,字元串要求類型相同,長度可以不同)。

設置外鍵的語法:CONSTRAINT 外鍵名 FOREIGN KEY (外鍵欄位)REFERENCES 參照表 (參照欄位) ON DELETE SET NULL ON UPDATE CASCADE 設置參照完整性。

3、外鍵約束的參照操作:

RESTRICT拒絕參照表刪除或更新參照欄位;

RESTRICT和NO ACTION相同,但這個指令只在mysql生效;

CASCADE刪除或更新參照表的參照欄位時,外鍵表的記錄同步刪除更新;

SET NULL 刪除或更新參照表的參照欄位時,外鍵表的外鍵設為NULL。

8. 資料庫的五種約束關系是什麼主外鍵有什麼用。求教

額,這是資料庫原理的基礎知識,比如連接,分左外連接,右外連接,外連接。
以左外連接為例
代碼大概為
select
*
from
data1
left
join
data2
on
data1.num=data2.num
where
data1.name='我'
可以連接不同的表。
主鍵,外鍵等的都是基礎的東西,主鍵相當於一列數據的身份證號碼,是唯一的。
外鍵就是說這個單元格的數據,是別的表的主鍵
。。。。。。
建議lz買本《資料庫原理》看看,一個星期就看會了。這個需要系統的學一下,半路出家學不到什麼東西
關於sql語句代碼,只有4種,select,update,insert,delete
非常簡單