美文网首页
210516:Oracle删除约束(6个)-Oracle数据库中

210516:Oracle删除约束(6个)-Oracle数据库中

作者: 弹钢琴的崽崽 | 来源:发表于2021-05-16 18:57 被阅读0次

一. oracle 删除主键约束_SQL基础知识:约束(实例)

给大家介绍SQL中六种工作中经常使用到的约束,供大家参考!

1. NOT NULL约束

  • NOT NULL 约束强制列不接受 NULL 值。
  • NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

下面的 SQL 强制表"Customers" 的"客户ID" 列和 "姓名" 列不接受 NULL 值:

CREATE TABLE Customers(
 客户ID INT NOT NULL,
 姓名 VARCHAR(10) NOT NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 邮编 CHAR(6) NULL,
 省份 VARCHAR(20) NULL
) ;

一旦这两列有空值NULL被插入,系统就会报错提示,例如我们插入如下信息:

INSERT INTO dbo.Customers  ( 姓名, 地址, 城市, 邮编, 省份 )
VALUES  (NULL,'花城大道1号','广州市','51000',NULL)

结果:

2. UNIQUE约束

UNIQUE 约束唯一标识数据库表中的每条记录,和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证,PRIMARY KEY 约束拥有自动定义的 UNIQUE约束。

请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

2.1 CREATE TABLE 时的 SQL UNIQUE 约束

下面的 SQL 在 "Orders" 表创建时在 "订单ID" 列上创建 UNIQUE 约束:

MySQL:

CREATE TABLE dbo.Orders(
 订单ID INT  NOT NULL,
 客户ID INT NULL,
 员工ID INT NULL,
 订单日期 DATETIME NULL,
 发货ID INT NULL,
 UNIQUE (订单ID)
) ;

SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Orders(
 订单ID INT NOT NULL UNIQUE,
 客户ID INT NULL,
 员工ID INT NULL,
 订单日期 DATETIME NULL,
 发货ID INT NULL
) ;

唯一约束是被约束的列在插入新数据时,如果和已经存在的列有相同的值,则会报错。

INSERT INTO dbo.Orders
       ( 订单ID, 客户ID, 员工ID, 订单日期, 发货ID )
VALUES  
       ( 1001,1,2,'2018-11-21 19:21:32',1),
       ( 1001,2,3,'2018-11-22 11:22:32',5)

结果为:

如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Orders(
 订单ID INT NOT NULL ,
 客户ID INT NULL,
 员工ID INT NULL,
 订单日期 DATETIME NULL,
 发货ID INT NULL,
 CONSTRAINT uc_OrderID UNIQUE (订单ID,发货ID)
) ;

2.2 ALTER TABLE 时的 UNIQUE 约束

当表已被创建时,如需在 "订单ID" 列创建 UNIQUE 约束,请使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD UNIQUE (订单ID)

如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Customers
ADD CONSTRAINT uc_CustomerID UNIQUE (客户ID,姓名)

2.3 删除UNIQUE 约束

如需删除UNIQUE 约束,请使用下面的 SQL:

MySQL:

ALTER TABLE Orders
DROP INDEX uc_OrderID

SQL Server / Oracle / MS Access:

ALTER TABLE Customers
DROP CONSTRAINT uc_CustomerID

3. PRIMARY KEY约束

PRIMARY KEY 约束唯一标识数据库表中的每条记录,主键必须包含唯一的值,主键列不能包含 NULL 值,每个表都应该有一个主键,并且每个表只能有一个主键。

3.1 CREATE TABLE 时的 PRIMARY KEY 约束

下面的 SQL 在 "Customers" 表创建时在 "客户ID" 列上创建 PRIMARY KEY 约束:

MySQL:

CREATE TABLE dbo.Customers(
 客户ID INT  NOT NULL,
 姓名 VARCHAR(10) NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 邮编 CHAR(6) NULL,
 省份 VARCHAR(20) NULL,
 PRIMARY KEY (客户ID)
) ;

SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Customers(
 客户ID INT  NOT NULL PRIMARY KEY,
 姓名 VARCHAR(10) NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 邮编 CHAR(6) NULL,
 省份 VARCHAR(20) NULL
) ;

如需命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE dbo.Customers(
 客户ID INT  NOT NULL PRIMARY KEY,
 姓名 VARCHAR(10) NULL,
 地址 VARCHAR(50) NULL,
 城市 VARCHAR(20) NULL,
 邮编 CHAR(6) NULL,
 省份 VARCHAR(20) NULL, 
 CONSTRAINT pk_CustomerID PRIMARY KEY (客户ID,姓名)
) ;

注释:在上面的实例中,只有一个主键 PRIMARY KEY(pk_CustomerID)。然而,pk_CustomerID 的值是由两个列(客户ID和姓名)组成的。

3.2 ALTER TABLE 时的 PRIMARY KEY 约束

当表已被创建时,如需在 "客户ID" 列创建 PRIMARY KEY 约束,请使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Customers
ADD PRIMARY KEY (客户ID)

如需命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Customers
ADD CONSTRAINT pk_CustomerID PRIMARY KEY (客户ID,姓名)

注释:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。

3.3 删除 PRIMARY KEY 约束

如需删除 PRIMARY KEY 约束,请使用下面的 SQL:

MySQL:

ALTER TABLE Customers
DROP PRIMARY KEY

SQL Server / Oracle / MS Access:

ALTER TABLE Customers
DROP CONSTRAINT pk_CustomerID

4. FOREIGN KEY约束

一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY,让我们通过一个实例来解释外键。

5. DEFAULT约束

DEFAULT 约束用于向列中插入默认值。

如果没有规定其他的值,那么会将默认值添加到所有的新记录。

6. CHECK约束

CHECK 约束用于限制列中的值的范围,如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。

约束详情请看这篇文章

二. oracle数据库 中to_number、to_char、to_date用法介绍

  • TO_DATE 是把字符串转换为数据库中得日期类型转换函数
  • TO_CHAR 是把日期或数字转换为字符串
  • TO_NUMBER 将字符转化为数字

1. TO_DATE

使用TO_DATE函数将字符转换为日期,规范:TO_DATE(char, '格式')

例1:

select to_date('2012-07-01 10:00:00','yyyy-mm-dd hh24:mi:ss') from dual;
select to_date('2012-07-01 10:00','yyyy-mm-dd hh24:mi') from dual;
select to_date('2012-07-01 10','yyyy-mm-dd hh24') from dual;
select to_date('2012-07-01','yyyy-mm-dd') from dual;
select to_date('2012-07','yyyy-mm') from dual;
select to_date('2012','yyyy') from dual;

注意:yyyy / yyy / yy 分别代表4位 / 3位 / 2位的数字年,mm代表月,dd代表日,hh24 / hh12分别代表24小时制 / 12小时制,mi代表分,ss代表秒

例2:

表jmzs里的czsj是vachar2类型,转换成date类型:

select to_date(czsj,'yyyy-mm-dd hh24:mi:ss') from jmzs;

2. TO_CHAR

使用TO_CHAR函数处理数字,规范:TO_CHAR(number, '格式')

使用TO_CHAR函数处理日期,规范:TO_CHAR(date,’格式’);

例1:

select To_Char(to_date('2012-07-01 10:00:00','yyyy-mm-dd hh24:mi:ss'),'yyyymmddhhmiss') from dual;

例2:

表jmzs里的czsj是vachar2类型,先转换成date类型,再转成char类型:

select To_Char(to_date(czsj,'yyyy-mm-dd hh24:mi:ss'),'yyyymmddhhmiss') from jmzs;

3. TO_NUMBER

使用TO_NUMBER函数将字符转换为数字,规范:TO_NUMBER(char, '格式')

例1:

select To_Number(To_Char(to_date('2012-07-01 10:00:00','yyyy-mm-dd hh24:mi:ss'),'yyyymmddhhmiss')) from dual;

例2:

表jmzs里的czsj是vachar2类型,先转换成date类型,再转成char类型,最后才能转成number类型:

select To_Number(To_Char(to_date(czsj,'yyyy-mm-dd hh24:mi:ss'),'yyyymmddhhmiss')) from jmzs;

To_number函数中也有很多预定义的固定格式:

格式值 含义
9 代表一个数字
0 强迫0显示
$ 显示美元符号
L 强制显示一个当地的货币符号
. 显示一个小数点
, 显示一个千位分隔符号

3.1 将一个字符串转成数值

TO_NUMBER('123.45')                        结果  123.45 
TO_NUMBER('$123,456.78','$999,999.99')     结果  123,456.78 

3.2 将字符串转换为数字数据类型

select to_number('00001228') from dual;--to_number('00001228')  1228
select trunc(to_number('123.123'),2) from dual;

结果为:123.12

3.3 转换一个十六进制数的浮标

SELECT TO_NUMBER('0A', 'XX')  FROM dual;

结果为:10

3.4 一个十六进制数转换为十进制

SELECT TO_NUMBER(100000,'XXXXXXXX') FROM dual;

结果为:1048576

select to_number('0123')number1,            --converts a string to number
       trunc(to_number('0123.123'),2) number2,
       to_number('120.11','999.99') number3,
     to_number('0a','xx') number4,        --converts a hex number to decimal
       to_number(100000,'xxxxxx') number5
from dual;

三. java实体entity转map对象

方法一:一句搞定,直接返回map对象:

import org.springframework.cglib.beans.BeanMap;
BeanMap.create(entityObj);

方法二:利用fastjson处理(未验证,但是理论上没问题)

import com.alibaba.fastjson.JSONObject;
String json = JSONObject.toJSONString(entityObj);
Map map = JSONObject.parseObject(json, Map.class);

四. oracle中如何让01+1等于02

写SQL指令即可:

select to_char('01'+1,'00') from dual;

需求:同一天的飞行编码没有的话从01开始,有的话取最大的值+1

实现sql

SELECT to_char(NVL(max(m.SERIAL_NUMBER),'00')+1,'00') SERIAL_NUMBER 
    FROM T_SLXF_AVIATION_PLAN_IMPLEM m 
    WHERE m.TASK_TYPE = '2' AND m.PLAN_DATE ='2020-12-25' and m.DEPT_TYPE = '2' and m.IS_DELETE = '0' GROUP BY m.PLAN_DATE

五. Java8 使用 stream().sorted()对List集合进行排序

1. 集合对像定义

集合对象以学生类(*StudentInfo*)为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项。

使用stream().sorted()进行排序,需要该类实现 *Comparable* 接口,该接口只有一个方法需要实现,如下:

public int compareTo(T o);

有关compareTo方法的实现说明,请参考:Java 关于重写compareTo方法

我的学生类代码如下:

import java.time.LocalDate;
import java.util.List;

public class StudentInfo implements Comparable<StudentInfo> {

    //名称
    private String name;

    //性别 true男 false女
    private Boolean gender;

    //年龄
    private Integer age;

    //身高
    private Double height;

    //出生日期
    private LocalDate birthday;

    public StudentInfo(String name, Boolean gender, Integer age, Double height, LocalDate birthday){
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.height = height;
        this.birthday = birthday;
    }

    public String toString(){
        String info = String.format("%s\t\t%s\t\t%s\t\t\t%s\t\t%s",this.name,this.gender.toString(),this.age.toString(),this.height.toString(),birthday.toString());
        return info;
    }

    public static void printStudents(List<StudentInfo> studentInfos){
        System.out.println("[姓名]\t\t[性别]\t\t[年龄]\t\t[身高]\t\t[生日]");
        System.out.println("----------------------------------------------------------");
        studentInfos.forEach(s->System.out.println(s.toString()));
        System.out.println(" ");
    }

    @Override
    public int compareTo(StudentInfo ob) {
        return this.age.compareTo(ob.getAge());
        //return 1;
    }

2. 添加测试数据

下面来添加一些测试用的数据,代码如下:

//测试数据,请不要纠结数据的严谨性
List<StudentInfo> studentList = new ArrayList<>();
studentList.add(new StudentInfo("李小明",true,18,1.76,LocalDate.of(2001,3,23)));
studentList.add(new StudentInfo("张小丽",false,18,1.61,LocalDate.of(2001,6,3)));
studentList.add(new StudentInfo("王大朋",true,19,1.82,LocalDate.of(2000,3,11)));
studentList.add(new StudentInfo("陈小跑",false,17,1.67,LocalDate.of(2002,10,18)));

3. 排序

3.1 使用年龄进行升序排序

//排序前输出
StudentInfo.printStudents(studentList);
//按年龄排序(Integer类型)
List<StudentInfo> studentsSortName = studentList.stream().sorted(Comparator.comparing(StudentInfo::getAge)).collect(Collectors.toList());
//排序后输出
StudentInfo.printStudents(studentsSortName);

结果如下图:

3.2 使用年龄进行降序排序(使用reversed()方法)

//排序前输出
StudentInfo.printStudents(studentList);
//按年龄排序(Integer类型)
List<StudentInfo> studentsSortName = studentList.stream().sorted(Comparator.comparing(StudentInfo::getAge).reversed()).collect(Collectors.toList());
//排序后输出
StudentInfo.printStudents(studentsSortName);

结果如下图:

3.3 使用年龄进行降序排序,年龄相同再使用身高升序排序

//排序前输出
StudentInfo.printStudents(studentList);
//按年龄排序(Integer类型)
List<StudentInfo> studentsSortName = studentList.stream()
    .sorted(Comparator.comparing(StudentInfo::getAge).reversed().thenComparing(StudentInfo::getHeight))
    .collect(Collectors.toList());
//排序后输出
StudentInfo.printStudents(studentsSortName);

结果如下图:

相关文章

网友评论

      本文标题:210516:Oracle删除约束(6个)-Oracle数据库中

      本文链接:https://www.haomeiwen.com/subject/ppyrjltx.html