2015-12-12 39 views
0

我只需要一点你的帮助,你能否检查我是否在SQL Server中正确地使用了外键?在SQL中检查外键,是不是?

我是新来的SQL,这就是为什么抱歉愚蠢的问题。

如果一切正常,我可以开始填写数据吗?

--CREATING EMPLOYEE TABLE 
CREATE TABLE EMPLOYEE(
[ID] INT IDENTITY(1,1) NOT NULL, 
[FIRST_NAME] NVARCHAR(25) NOT NULL, 
[LAST_NAME] NVARCHAR(25) NOT NULL, 
[EMAIL] nvarchar(60) NOT NULL CONSTRAINT UQ_EMPLOYEE_email UNIQUE, 
[PHARMACY_ID] INT NOT NULL, 
CONSTRAINT PK_EMPLOYEE_ID PRIMARY KEY (ID)); 

--CREATING PHARMACY TABLE 
CREATE TABLE PHARMACY (
[ID] INT IDENTITY(1, 1) NOT NULL, 
[NAME] NVARCHAR(25), 
[ADDRESS] NVARCHAR(25) NULL, 
[PHONE] nvarchar(24) NULL CHECK(PHONE like '(___)-__-___ __ __'), 
[EID] [INT] NOT NULL 
CONSTRAINT PK_PHARMACY_ID PRIMARY KEY (ID)); 

--CREATE SUPPLIERS TABLE 
CREATE TABLE SUPPLIERS(
[ID] INT IDENTITY(1,1) NOT NULL, 
[NAME] NVARCHAR(25), 
[ADDRESS] NVARCHAR(25) NULL, 
[DRUGSID] [INT] NOT NULL, 
CONSTRAINT PK_SUPPLIERS_ID PRIMARY KEY (ID)); 

--CREATE TABLE DRUGS 
CREATE TABLE DRUGS(
[ID] INT IDENTITY(1,1) NOT NULL, 
[NAME] NVARCHAR(25), 
[QUANTITY] INT NULL, 
[ORDERID] [INT] NULL, 
[SUPPLIERID] [INT] NULL, 
CONSTRAINT PK_DRUGS_ID PRIMARY KEY(ID)); 

--CREATEING TABLE ORDERS 
CREATE TABLE ORDERS (
[ID] INT IDENTITY(1,1) NOT NULL, 
[ONAME] NVARCHAR(25) NOT NULL, 
[ODATE] DATETIME, 
[OQUANTITY] INT NOT NULL, 
[SUPPLIERID] [INT] NOT NULL, 
[DRUGID] [INT] NOT NULL, 
CONSTRAINT PK_ORDERS_ID PRIMARY KEY(ID)); 

--CREATING TABLE MANAGER TABLE 
CREATE TABLE MANAGER (
[PASSPORTNO] INT IDENTITY(1,1) NOT NULL, 
[HOURLYPAY] DECIMAL(5,2) NULL, 
[LANGUAGE_SKILLS] NVARCHAR(25) NULL 
CONSTRAINT PK_MANAGER_NO PRIMARY KEY (PASSPORTNO)); 

--CREATING TABLE SALES ASSISTANT 
CREATE TABLE SALES_ASSISTANT (
[PASSPORTNO] INT IDENTITY(1,1) NOT NULL, 
[SALARY] DECIMAL(5,2) NULL 
CONSTRAINT PK_SALES_ASSISTANT_NO PRIMARY KEY (PASSPORTNO)); 

-- FOREIGN KEYs CREATION 
ALTER TABLE EMPLOYEE ADD CONSTRAINT FK_PHARMACYID FOREIGN KEY(PHARMACY_ID) 
REFERENCES PHARMACY(ID) ON DELETE CASCADE ON UPDATE CASCADE 

ALTER TABLE PHARMACY ADD CONSTRAINT FK_EID FOREIGN KEY(EID) 
REFERENCES EMPLOYEE(ID) ON DELETE NO ACTION ON UPDATE NO ACTION 

ALTER TABLE SUPPLIERS ADD CONSTRAINT FK_DRUGID FOREIGN KEY(DRUGSID) 
REFERENCES DRUGS(ID) ON DELETE NO ACTION ON UPDATE NO ACTION 

ALTER TABLE DRUGS ADD CONSTRAINT FK_ORDERID FOREIGN KEY(ORDERID) 
REFERENCES ORDERS(ID) ON DELETE NO ACTION ON UPDATE NO ACTION 


ALTER TABLE DRUGS ADD CONSTRAINT FK_SUPPLIERS FOREIGN KEY(SUPPLIERID) 
REFERENCES SUPPLIERS(ID) ON DELETE NO ACTION ON UPDATE NO ACTION 


ALTER TABLE ORDERS ADD CONSTRAINT FK_SUPPLIERS_OR FOREIGN KEY(SUPPLIERID) 
REFERENCES SUPPLIERS(ID) ON DELETE NO ACTION ON UPDATE NO ACTION 

ALTER TABLE ORDERS ADD CONSTRAINT FK_DRUGID_OR FOREIGN KEY(DRUGID) 
REFERENCES DRUGS(ID) ON DELETE NO ACTION ON UPDATE NO ACTION 
+0

可能重复[什么是MySQL的默认ON DELETE行为?](http://stackoverflow.com/questions/1027656/what-is-mysqls-default-on-delete-behavior) – lad2025

+2

@ lad2025它未被标记MySQL – Paparazzi

+0

您是否考虑重新命名每个ID字段,使其更清晰哪些是哪些内容以及与哪些内容相关联?例如:DrugId而不是ID。 –

回答

1

您可以检查所设置与此查询

SELECT 
    KCU1.CONSTRAINT_NAME AS FK_CONSTRAINT_NAME 
    ,KCU1.TABLE_NAME AS FK_TABLE_NAME 
    ,KCU1.COLUMN_NAME AS FK_COLUMN_NAME 
    ,KCU1.ORDINAL_POSITION AS FK_ORDINAL_POSITION 
    ,KCU2.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT_NAME 
    ,KCU2.TABLE_NAME AS REFERENCED_TABLE_NAME 
    ,KCU2.COLUMN_NAME AS REFERENCED_COLUMN_NAME 
    ,KCU2.ORDINAL_POSITION AS REFERENCED_ORDINAL_POSITION 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC 

INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU1 
    ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG 
    AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA 
    AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME 

INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU2 
    ON KCU2.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG 
    AND KCU2.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA 
    AND KCU2.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME 
    AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION 

一件事的外键: 始终创建脚本,以便在需要时可以运行N次。 因此,在创建它之前先删除外键,或者只在外键不存在时才创建它。表格也是一样(如果它们包含数据,请不要丢弃它们)。

此外,如果创建外键,则应检查是否存在所有引用的表,并检查引用的表是否具有主键集。

编辑: 一个技巧,在快速眩光:
我会检查,如果你真的需要DATETIME。
如果您只需要日期,请使用日期而不是日期时间。

+0

我不认为Nuriddin正在寻找一个声明来从数据库中检索定义。如果设计是正确的,她/他正在寻找建议。 –

+0

@a_horse_with_no_name:是的,但它也可以解释为“我是否真的设置了所有外键”。 –

0

这就是你如何做FK但数据设计看起来不正确。您没有订单指向药物和药物指向订单。在3NF阅读。供应商没有单一药物。 DrugsID可能有一个S,但它仍然是单数。此数据设计不正确。