zoukankan      html  css  js  c++  java
  • sql基础语法-创建表和约束

    创建数据库表

    USE SQL2016
    IF OBJECT_ID('dbo.Employees','U') IS NOT NULL
    DROP TABLE dbo.Employees;
    
    Create TABLE dbo.Employees
    (
    empid INT NOT NULL,
    firstname VARCHAR(30) NOT NULL,
    lastname VARCHAR(30) NOT NULL,
    salary Money Null
    );
    
    USE SQL2016
    IF OBJECT_ID('dbo.Orders','U') IS NOT NULL
    DROP TABLE dbo.Orders;
    
    Create TABLE dbo.Orders
    (
    orderid INT NOT NULL,
    empid INT NOT NULL,
    customerid VARCHAR(30) NOT NULL,
    qty INT NOT Null,
    orderdatetime DATETIME2 NOT NULL,
    CONSTRAINT PK_Orders--建立表时,直接创建主键约束
    PRIMARY KEY (orderid)
    );
    --表已经存在,创建主键约束
    ALTER TABLE dbo.Employees
    ADD CONSTRAINT PK_Employees
    PRIMARY KEY(empid);
    
    --唯一约束
    ALTER TABLE dbo.Employees 
    ADD CONSTRAINT UNQ_Employees_lastname
    UNIQUE(lastname);
    
    
    --外键约束
    ALTER TABLE dbo.Orders
    ADD CONSTRAINT FK_Orders_Employees
    FOREIGN KEY(empid)
    REFERENCES dbo.Employees(empid);
    
    --CHECK约束
    ALTER TABLE dbo.Employees
    Add CONSTRAINT CHK_Employees_Salary
    CHECK(salary>0.00);
    
    --默认约束
    ALTER TABLE dbo.Orders
    ADD CONSTRAINT DFT_Orders_orders
    DEFAULT(SYSDATETIME()) FOR orderdatetime
    
    

     创建测试数据

    --创建测试数据
    
    --以下两段脚本创建了 两个employee 
    
    USE [SQL2016]
    GO
    
    INSERT INTO [dbo].[Employees]
    ([empid]
    ,[firstname]
    ,[lastname]
    ,[salary])
    VALUES
    (1,'zhang','san',5000)
    GO
    
    INSERT INTO [dbo].[Employees]
    ([empid]
    ,[firstname]
    ,[lastname]
    ,[salary])
    VALUES
    (2,'li','si',6000)
    GO 
    
    --以下脚本创建了两个orders
    
    USE [SQL2016]
    GO
    
    INSERT INTO [dbo].[Orders]
    ([orderid]
    ,[empid]
    ,[customerid]
    ,[qty])
    VALUES
    (1,1,'CUS1',10)
    GO
    
    INSERT INTO [dbo].[Orders]
    ([orderid]
    ,[empid]
    ,[customerid]
    ,[qty])
    VALUES
    (2,2,'CUS2',20)
    GO

    验证约束条件

    验证外键约束,empid为3的employee不存在,故以下脚本报错

    USE [SQL2016]
    GO
    
    INSERT INTO [dbo].[Orders]
    ([orderid]
    ,[empid]
    ,[customerid]
    ,[qty])
    VALUES
    (3,10,'CUS1',10)
    GO

    验证外键约束,删除主表记录,主表中的值被其他表引用,empid=1的记录在order中被引用,故删除错误

    USE [SQL2016]
    DELETE FROM dbo.Employees WHERE empid=1
    GO

    验证外键约束,UPDATE主表记录,主表中的值被其他表引用,empid=1的记录在order表中被引用,故更新失败

    USE [SQL2016]
    UPDATE dbo.Employees set empid=4 where empid=1
    GO

    外键约束默认执行 no action引用操作,即delete 和 update 数据时,如果被引用,则默认不允许操作。

    其他选项:
    CASCADE:将级联相关的行
    SET DEFAULT:将相关行设置为默认值
    SET NULL:将相关行设置为NULL

    将Delete Rule 和Update Rule 改为 CASCADE后。

    执行以下脚本,将empid=1改为4,删除empid=2的记录。则应该自动修改Orders里的empid=1的改为4,删除empid=2的orders

    USE [SQL2016]
    GO
    UPDATE dbo.Employees set empid=4 where empid=1
    
    DELETE FROM dbo.Employees WHERE empid=2
    
    GO
    
    SELECT * FROM dbo.Orders

    CHECK 约束仅当false时拒绝操作,当为true和unknow时允许操作,例如
    -1000,拒绝操作
    5000,允许操作
    NULL,允许操作
    WITH NOCHECK 选项:

  • 相关阅读:
    业务领域建模Domain Modeling
    用例建模Use Case Modeling
    分析一套源代码的代码规范和风格并讨论如何改进优化代码
    结合工程实践选题调研分析同类软件产品
    如何提高程序员的键盘使用效率
    python知识准备及环境配置
    一张图片在Python操作下的4种玩法(附源码)
    Python中的错误和异常
    当你忘记网站上的密码时怎么办?Python如何快速帮你找回?
    Python最简单的图片爬虫,20行代码带你爬遍整个网站
  • 原文地址:https://www.cnblogs.com/shuzhenyu/p/5725412.html
Copyright © 2011-2022 走看看