1、外鍵是屬于約束的一種,所謂約束顧名思義,就是限制你在數(shù)據(jù)庫的操作。而你對數(shù)據(jù)庫有什么操作,無非是增、刪、改、查,外鍵起的作用就是讓你在數(shù)據(jù)庫幫助的情況下更合理的增加數(shù)據(jù)的正確度。
創(chuàng)新互聯(lián)-云計算及IDC服務(wù)提供商,涵蓋公有云、IDC機(jī)房租用、服務(wù)器托管、等保安全、私有云建設(shè)等企業(yè)級互聯(lián)網(wǎng)基礎(chǔ)服務(wù),咨詢熱線:18982081108
2、所以,外鍵只是輔助,并不能起到你說的【B.NAME是否也自動出現(xiàn)張三兩個字】。
3、外鍵的作用是能夠避免如下情況。
如
【班級信息表】存放的是班級信息表。
【學(xué)生表】存放的是學(xué)生信息,包含班級信息。
這個時候 在【學(xué)生表】中存放的班級信息應(yīng)該在【班級信息表】存在才合法,自己人為控制的話難免有漏掉的情況,用外鍵則可以讓數(shù)據(jù)庫自動控制,當(dāng)插入【學(xué)生表】中的數(shù)據(jù)在【班級信息表】不存在的時候,數(shù)據(jù)庫不允許插入。
---
以上,希望對你有所幫助。
以oracle自帶的用戶scott為例。
create?table?dept(
deptno?number(2)?primary?key,?--deptno?為?dept表的主鍵
dname?varchar2(10),
loc?varchar2(9)
);
create?table?emp(
empno?number(4)?primary?key,?--empno?為?emp表的主鍵
ename?varchar2(10),
job?varchar2(9),
mgr?number(4),
hiredate?date,
sal?number(7,2),
comm?number(7,2),
deptno?number(2)?references?dept(deptno)?--dept表中deptno字段?為?emp表的外鍵
);
create TABLE zhao(
id number primary key,
mingcheng nvarchar2(50),
neirong nvarchar2(50),
jiezhiriqi date,
zhuangtai nvarchar2(50)
);
create TABLE tou(
id number primary key,
zhao_id number,
toubiaoqiye nvarchar2(50),
biaoshuneirong nvarchar2(50),
toubiaoriqi date,
baojia number,
zhuangtai nvarchar2(50),
foreign KEY(zhao_id) REFERENCES zhao(id)
);
foreign key (zhao_id) references to zhao(id)
多了個to
-- 創(chuàng)建測試主表. ID 是主鍵.
CREATE TABLE test_main (
id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 創(chuàng)建測試子表.
CREATE TABLE test_sub (
id INT,
main_id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 創(chuàng)建外鍵
ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main;
SQL?drop?table?Stu;
drop?table?Stu
*
ERROR?位于第?1?行:
ORA-00942:?表或視圖不存在
SQL?create?table?Stu(
2??sno?varchar2(10)?primary?key,
3??sname?varchar2(10)?not?null,
4??sex?varchar2(5)?check(sex='男'or?sex='女'),
5??class?varchar2(10),
6??spasswd?varchar2(10)
7??);
表已創(chuàng)建。
SQL?drop?table?Cou;
drop?table?Cou
*
ERROR?位于第?1?行:
ORA-00942:?表或視圖不存在
SQL?create?table?Cou(
2??cno?varchar2(10)?primary?key,
3??cname?varchar2(30)?not?null,
4??kcxz?varchar2(20),
5??lesson_hours?number(4),
6??test_hours?number(4),
7??credit?number(3)
8??);
表已創(chuàng)建。
SQL?drop?table?SC;
drop?table?SC
*
ERROR?位于第?1?行:
ORA-00942:?表或視圖不存在
SQL?create?table?SC(
2??sno?varchar2(10),
3??cno?varchar2(10),
4??grade?number(3),
5??primary?key(sno,cno)
6??);
表已創(chuàng)建。
SQL?
SQL?
SQL?ALTER?TABLE?SC?ADD?CONSTRAINT?fk_SC_Stu??FOREIGN?KEY?(sno)??REFERENCES??Stu;
表已更改。
SQL?
SQL?ALTER?TABLE?SC?ADD?CONSTRAINT?fk_SC_Cou??FOREIGN?KEY?(cno)??REFERENCES??Cou;
表已更改。
SQL
一般授予connect權(quán)限用戶就能夠連接數(shù)據(jù)了,授予resource權(quán)限用戶就可以建表、索引、視圖、存儲過程了,其他權(quán)限根據(jù)具體需求來建,具體示例如下:
登錄數(shù)據(jù)庫服務(wù)器,運(yùn)行sqlplus,
connect / as sysdba
create user test identified by test1234 tablespace test_data;(需要事先建好test_data表空間)
grant connect to test;
grant resource to test;
如果該用戶需要查詢數(shù)據(jù)庫中所有數(shù)據(jù):grant select any table to test;
如果該用戶需要讀取數(shù)據(jù)字典、使用OEM工具等:grant select dictionary to test;
如果該用戶需要操作其他用戶的表(如對scott用戶下的emp表進(jìn)行增刪改操作):
grant insert,update,delete on scott.emp to test;