zoukankan      html  css  js  c++  java
  • Oracle表的操作

     
     --创建表
    CREATE [GLOBAL TEMPORARY] TABLE table_name(
    coloum_name TYPE [CONSTRAINT constraint_def DEFAULT default_exp]
    [,coloum_name TYPE [CONSTRAINT constraint_def DEFAULT default_exp] ...]
    )
    [ON COMMIT {DELETE | PRESERVE} ROWS]
    TABLESPACE tab_space;
    /*
    GLOBAL TEMPORARY 说明该表的行是临时表,这种表就称为临时表。行的有效性由on commit子句指定
    ON COMMIT 控制临时表中行的有效期。DELETE 说明这些行在事务的末尾要被删除。PRESERVE 说明
    这些行要在会话的末尾要被删除。
    TABLESPACE 为该表指定表空间。若没有指定,该表就存储在用户的默认表空间。
    */
    CREATE TABLE Order_Status2(
    ID INTEGER CONSTRAINT Order_Status2_pk PRIMARY KEY,
    status VARCHAR2(10),
    last_modified DATE DEFAULT SYSDATE
    );
    
    CREATE GLOBAL TEMPORARY TABLE Order_Status_temp(
    ID INTEGER,
    status VARCHAR2(10),
    last_modified DATE DEFAULT SYSDATE
    )
    ON COMMIT PRESERVE ROWS;
    
    INSERT INTO Order_Status_temp
    VALUES(1,'New',SYSDATE);
    
    SELECT * FROM Order_Status_temp;
    
    --获得有关表的信息
    --对表执行 describe 命令。
    --查询user_tables
    SELECT * FROM user_tables;
    SELECT * FROM all_tables;
    
    SELECT table_name, tablespace_name, temporary
      FROM user_tables
     WHERE table_name IN ('ORDER_STATUS2', 'ORDER_STATUS_TEMP');
    
    --获取表的列的信息
    SELECT * FROM user_tab_columns;
    SELECT * FROM all_tab_columns;
    
    SELECT column_name, data_type, data_length, data_precision, data_scale
      FROM user_tab_columns
     WHERE table_name = 'PRODUCTS';
    
    --修改表
    --alter table
    /*
    添加、修改或删除列
    添加或删除约束
    启用或禁用约束
    */
    --添加列
    CREATE TABLE Order_Status2 AS SELECT * FROM Order_Status;
    
    ALTER TABLE Order_Status2 ADD modified_by INTEGER;
    
    ALTER TABLE Order_Status2 ADD initially_created DATE DEFAULT SYSDATE NOT NULL;
    
    --修改列
    /*
    修改列的长度
    修改数字列的精度
    修改列的数据类型
    修改列的默认值
    */
    --修改列的长度
    --只有在表中没有行或这列为空值时才可以减小列的长度
    ALTER TABLE Order_Status2 MODIFY status VARCHAR2(15);
    
    --修改数字列的精度
    --只有在表中没有行或这列为空值时才可以减小列的精度
    ALTER TABLE Order_Status2 ADD ID NUMBER(4);
    ALTER TABLE Order_Status2 MODIFY id NUMBER(5);
    
    --修改列的数据类型
    --如果表中没有或这列为空值时,可以修改为任何类型,否则只能修改为兼容的数据类型
    ALTER TABLE Order_Status2 MODIFY status char(15);
    
    --修改列的默认值
    ALTER TABLE Order_Status2 MODIFY last_modified DEFAULT SYSDATE - 1;
    
    --删除列
    ALTER TABLE Order_Status2 DROP COLUMN initially_created;
    
    --添加约束
    
    ----------------------------------------------------------------------------------------------
    约束                约束类型                 意义
    ----------------------------------------------------------------------------------------------
    CHECK                 C                指定一列或一组列的值必须满足特定的约束
    ----------------------------------------------------------------------------------------------
    NOT NULL              C                指定一列不允许存储空值。这实际上是一种强制的check约束
    ----------------------------------------------------------------------------------------------
    PRIMARY KEY           P                指定表的主键。主键由一列或多列组成。它唯一标识了表的一行
    ----------------------------------------------------------------------------------------------
    FOREIGN KEY           F                指定表的外键。外键引用另外一个表中的一列,在自引用情况下
                                           则引用本表中的一列
    ----------------------------------------------------------------------------------------------
    UNIQUE                U                指定一列或一组列只能存储唯一的值
    ----------------------------------------------------------------------------------------------
    CHECK OPTION          V                指定对视图执行的DML操作必须满足子查询的条件。
    ----------------------------------------------------------------------------------------------
    READ ONLY             O                指定视图是只读的
    ----------------------------------------------------------------------------------------------
    
    --(1)添加check约束
    ALTER TABLE Order_Status2 ADD CONSTRAINT order_status2_status_ck 
    CHECK (status IN ('PLACED','PENDING','SHIPPED'));
    
    INSERT INTO order_status2
      (status, last_modified, modified_by)
    VALUES
      ('', SYSDATE, 2);
    
    ALTER TABLE Order_Status2 ADD CONSTRAINT order_status2_id_ck 
    CHECK (ID > 0);
    
    --(2)添加not null约束
    ALTER TABLE Order_Status2 MODIFY status CONSTRAINT order_status2_status_nn NOT NULL;
    
    ALTER TABLE Order_Status2 MODIFY modified_by CONSTRAINT order_status2_modified_by_nn NOT NULL;
    
    ALTER TABLE Order_Status2 MODIFY last_modified NOT NULL;
    
    SELECT * FROM Order_Status2;
    
    INSERT INTO Order_Status2
    VALUES(1,'PLACED',SYSDATE,NULL);
    
    --(3)添加primary key约束
    CREATE TABLE table_name(
    col_name TYPE PRIMARY KEY,
    ...
    );
    
    CREATE TABLE table_name(
    col_name TYPE CONSTRAINT cons_name PRIMARY KEY,
    ...
    );
    
    ALTER TABLE table_name ADD CONSTRAINT col_name_pk PRIMARY KEY(col_name);
    
    CREATE TABLE t_pk(pid INT);
    ALTER TABLE t_pk ADD CONSTRAINT pid_pk PRIMARY KEY(pid);
    
    --(4)添加foregin key约束
    ALTER TABLE Order_Status2 DROP COLUMN modified_by;
    
    SELECT * FROM Order_Status2;
    SELECT * FROM employees;
    
    ALTER TABLE employees ADD CONSTRAINT employees_id_fk PRIMARY KEY(employee_id);
    
    --没有存在列,加入外键
    ALTER TABLE Order_Status2 ADD CONSTRAINT  Order_Status2_modified_by_fk modified_by 
    REFERENCES employees(employee_id);
    
    --存在列,加入外键
    ALTER TABLE Order_Status2 ADD CONSTRAINT  Order_Status2_modified_by_fk FOREIGN KEY(modified_by) 
    REFERENCES employees(employee_id);
    
    SELECT * FROM Order_Status2;
    
    --外键对插入的影响
    INSERT INTO Order_Status2
    VALUES(3,'PLACED',SYSDATE,4);
    INSERT INTO Order_Status2
    VALUES(2,'PLACED',SYSDATE,4);
    INSERT INTO Order_Status2
    VALUES(4,'PLACED',SYSDATE,3);
    
    --外键对修改的影响
    SELECT * FROM Order_Status2;
    SELECT * FROM employees;
    
    UPDATE Order_Status2
    SET modified_by = 4
    WHERE order_status_id = 2;
    
    --外键对删除的影响
    DELETE employees 
    WHERE employee_id = 4;
    
    
    --使用一个带有foreign key约束的on delete cascade子句,可以指定在父表中删除一行记录时,子表中匹配的所有行
    --也都将被删除。
    ALTER TABLE Order_Status2 DROP COLUMN modified_by;
    
    ALTER TABLE Order_Status2 ADD CONSTRAINT  Order_Status2_modified_by_fk modified_by 
    REFERENCES employees(employee_id) ON DELETE CASCADE;
    
    --当从employees表中删除一行记录时,Order_Status2表所匹配的行也将都被删除。
    DELETE employees 
    WHERE employee_id = 4;
    
    --使用一个带有foreign key约束的on delete set null子句,可以指定在父表中删除一行记录时,子表中匹配行的外键
    --将被设置为空值
    ALTER TABLE Order_Status2 DROP COLUMN modified_by;
    
    ALTER TABLE Order_Status2 ADD CONSTRAINT  Order_Status2_modified_by_fk modified_by 
    REFERENCES employees(employee_id) ON DELETE SET NULL;
    
    --当从employees表中删除一行记录时,Order_Status2表所匹配的行所在的外键列都被置为null。
    DELETE employees 
    WHERE employee_id = 4;
    
    --(5)添加unique约束
    ALTER TABLE Order_Status2 ADD CONSTRAINT  Order_Status2_status_uq UNIQUE(status);
    
    --删除约束
    ALTER TABLE Order_Status2 DROP CONSTRAINT Order_Status2_status_uq;
    
    --禁用约束
    ALTER TABLE Order_Status2 ADD CONSTRAINT  Order_Status2_status_uq UNIQUE(status) DISABLE;
    
    ALTER TABLE Order_Status2 DISABLE  CONSTRAINT order_status2_modified_by_nn;
    
    --启用约束
    --表中的所有行必须满足约束条件
    ALTER TABLE Order_Status2 ENABLE  CONSTRAINT Order_Status2_status_uq;
    --对新数据启用约束
    ALTER TABLE Order_Status2 ENABLE NOVALIDATE CONSTRAINT Order_Status2_status_uq;
    
    --延迟约束
    --deferred constraint是在事务被提交时强制执行的约束。
    --在添加约束时,可以使用deferrable子句指定约束是延迟约束。
    --在添加延迟约束时,可以将其标识为initally immediate 或initally deferred。
    --initally immediate每次向表中添加数据、修改数据或删除数据时都要检查这个约束
    --initally deferred只有在事务被提交时才会检查这个约束。
    ALTER TABLE  Order_Status2
    DROP CONSTRAINT Order_Status2_status_uq;
    
    ALTER TABLE  Order_Status2 ADD CONSTRAINT Order_Status2_status_uq UNIQUE(status)
    DEFERRABLE INITIALLY DEFERRED;
    
    INSERT INTO Order_Status2
    VALUES(3,'Order placed',SYSDATE);
    
    --若向Order_Status2表中添加行,那么只有在执行commit时,才会对Order_Status2_status_uq约束进行检查
    
    --获取约束的信息
    SELECT * FROM User_Constraints;
    SELECT * FROM all_Constraints;
    
    SELECT constraint_name, constraint_type, status, deferrable, deferred
      FROM user_constraints
     WHERE table_name = 'ORDER_STATUS2';
    
    --获取有关列约束的信息
    SELECT * FROM User_Cons_Columns;
    SELECT * FROM all_Cons_Columns;
    
    SELECT constraint_name, column_name
      FROM user_cons_columns
     WHERE table_name = 'ORDER_STATUS2';
    
    SELECT ucc.column_name, ucc.constraint_name, uc.constraint_type, uc.status
      FROM user_constraints uc, user_cons_columns ucc
     WHERE uc.table_name = ucc.table_name
       AND uc.constraint_name = ucc.constraint_name
       AND ucc.table_name = 'ORDER_STATUS2';
    
    --重命名表
    RENAME Order_Status2 TO order_state;
    
    RENAME order_state TO Order_Status2;
    
    --向表中添加注释
    --注释有助于记住表或列的用途
    COMMENT ON TABLE Order_Status2 IS 'Order_Status2 stores the state of an order';
    
    COMMENT ON COLUMN Order_Status2.last_modified 
    IS 'last_modified stores the date of the order was modified last';
    
    --获取表的注释
    SELECT * FROM user_tab_comments WHERE table_name = 'ORDER_STATUS2';
    
    --获取列的注释
    SELECT * FROM user_col_comments WHERE table_name = 'ORDER_STATUS2';
    
    --截断表
    TRUNCATE TABLE Order_Status2;
    
    --删除表
    DROP TABLE Order_Status2;
    
    --创建序列
    CREATE SEQUENCE seq_name
    [START WITH start_num]
    [INCREMENT BY increment_num]
    [{MAXVALUE Maxvalue_num|nomaxvalue}]
    [{MINVALUE Minvalue_num|Minvalue}]
    [{CYCLE|nocycle}]
    [{CACHE cache_name|NOCACHE}]
    [{ORDER|NOORDER}];
    
    START WITH start_num指定序列从哪个整数开始,默认值为1
    INCREMENT BY increment_num指定序列每次增加的增量,默认值为1
    MAXVALUE Maxvalue_num指定该序列的最大整数
    MINVALUE Minvalue_num指定该序列的最小整数
    
    CREATE SEQUENCE test_seq;
    
    CREATE SEQUENCE test2_seq
    START WITH 10 INCREMENT BY 5
    MINVALUE 10 MAXVALUE 20
    CYCLE CACHE 2 ORDER;
    
    CREATE SEQUENCE test3_seq
    START WITH 10 INCREMENT BY -1
    MINVALUE 1 MAXVALUE 10
    CYCLE CACHE 5;
    
    --获取序列的信息
    SELECT * FROM User_Sequences;
    SELECT * FROM All_Sequences;
    
    --使用序列
    --序列生成一系列数字,一个序列中包含两个伪列currval nextval,可以分别用来获取该序列的当前值和下一个值。
    --在检索序列的当前值之前,必须通过检索序列的下一个值对序列进行初始化。
    --初始化后,则可以使用currval来获取该序列的当前值了。
    SELECT test_seq.nextval FROM dual;
    
    SELECT test_seq.currval FROM dual;
    
    --使用序列来填充主键
    CREATE TABLE Order_Status2(
    ID INTEGER CONSTRAINT order_status2_pk PRIMARY KEY,
    status VARCHAR2(10),
    last_modified DATE DEFAULT SYSDATE
    );
    
    CREATE SEQUENCE Order_Status2_seq NOCACHE;
    
    INSERT INTO Order_Status2(ID,status,last_modified)
    VALUES (Order_Status2_seq.nextval,'PLACED',SYSDATE);
    
    INSERT INTO Order_Status2(ID,status,last_modified)
    VALUES (Order_Status2_seq.nextval,'PENDING',SYSDATE);
    
    --删除序列
    DROP SEQUENCE test3_seq;
    
    --索引
    --创建索引
    CREATE [UNIQUE]INDEX index_name ON table_name(column_name[,COLUMN_name ...])
    TABLESPACE tab_space;
    
    /*
    UNIQUE指定索引列中的值必须是唯一的
    */
    SELECT customer_id, first_name, last_name
      FROM customers
     WHERE last_name = 'Brown';
    
    CREATE INDEX customers_last_name_idx ON customers(Last_Name);
    
    CREATE UNIQUE INDEX customers_phone_idx ON customers(phone);
    INSERT INTO customers VALUES (6, 'aa', 'bb', SYSDATE, '800-555-1214');
    
    CREATE INDEX customers_first_last_name_idx ON employees(first_name,Last_Name);
    
    --获取索引的信息
    SELECT * FROM user_indexes;
    SELECT * FROM all_indexes;
    
    SELECT index_name, table_name, uniqueness, status
      FROM user_indexes
     WHERE table_name IN ('CUSTOMERS', 'EMPLOYEES');
    
    --获取列索引的信息
    SELECT * FROM User_Ind_Columns;
    SELECT * FROM All_Ind_Columns;
    
    SELECT index_name, table_name, column_name
      FROM user_ind_columns
     WHERE table_name IN ('CUSTOMERS', 'EMPLOYEES');
    
    --删除索引
    DROP INDEX customers_first_last_name_idx;
    
    --视图
    --创建视图
    CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_name 
    [(alias_name[,alias_name ...])] AS subquery
    [WITH {CHECK OPTION | READ ONLY}] CONSTRAINT constraint_name];
    
    /*
    or replace 若视图存在则替换视图
    force即使基表不存在也要创建视图
    noforce若基表不存在,就不创建视图,为默认选项
    alias_name为子查询中的表达式指定一个别名
    subquery指定一个子查询,它对基表进行检索
    with check option说明子查询检索的行才能被插入、修改或删除。
    constraint_name指定with check option或read only约束的名称。
    read only说明只能对基表中的行进行只读访问
    */
    
    --简单视图,包含一个子查询,只从一个基表中检索数据
    --复杂视图,包含一个子查询,从多个基表中检索数据,包含分组,函数调用等
    --创建并使用简单视图
    CREATE OR REPLACE VIEW cheap_products_view AS
    SELECT * FROM products 
    WHERE price <  15;
    
    CREATE VIEW employees_view AS
    SELECT employee_id,manager_id,first_name,last_name,title
    FROM employees;
    
    --对视图进行select操作
    SELECT product_id,NAME,price
    FROM cheap_products_view;
    
    SELECT * FROM employees_view;
    
    --对视图进行insert操作
    --只能对简单视图执行DML操作,复杂视图不支持DML操作
    INSERT INTO cheap_products_view
      (product_id, product_type_id, NAME, price)
    VALUES
      (13, 1, 'Western Front', 13.50);
      
    SELECT * FROM cheap_products_view;
    
    --没有with check option,可以插入、修改或删除子查询不能检索的行
    INSERT INTO cheap_products_view
      (product_id, product_type_id, NAME, price)
    VALUES
      (14, 1, 'Eastern Front', 16.50);
      
    SELECT * FROM cheap_products_view
    WHERE  product_id = 14;
    
    --没有选择的基表列被置为空值,salary为null
    INSERT INTO employees_view
      (employee_id, manager_id, first_name, last_name, title)
    VALUES
      (5, 1, 'Jeff', 'Jones', 'CTO');
    
    SELECT * FROM employees
    WHERE employee_id = 5;
    
    --创建具有check option约束的视图
    --指定对视图的DML操作必须满足子查询的条件。
    CREATE OR REPLACE VIEW cheap_products_view2 AS
    SELECT * FROM products 
    WHERE price <  15
    WITH OPTION CHECK CONSTRAINT cheap_products_view2_price;
    
    INSERT INTO cheap_products_view2
      (product_id, product_type_id, NAME, price)
    VALUES
      (15, 1, 'Southern Front', 16.50);
    
    --创建具有read only约束的视图
    --指定视图是只读的
    CREATE OR REPLACE VIEW cheap_products_view3 AS
    SELECT * FROM products 
    WHERE price <  15
    WITH READ ONLY CONSTRAINT cheap_products_view3_read_only;
    
    INSERT INTO cheap_products_view3
      (product_id, product_type_id, NAME, price)
    VALUES
      (16, 1, 'Northern Front', 19.50);
    
    --获取有关视图定义的信息
    SELECT * FROM User_Views;
    SELECT * FROM all_views;
    
    --获取有关视图约束的信息
    SELECT constraint_name, constraint_type, status, deferrable, deferred
      FROM user_constraints
     WHERE table_name IN ('CHEAP_PRODUCTS_VIEW2', 'CHEAP_PRODUCTS_VIEW3');
    
    --删除视图
    DROP VIEW cheap_products_view3;
    
  • 相关阅读:
    Mongodb副本集集群搭建
    Mongodb分片副本集集群搭建
    python-字符串格式化
    python -序列化
    python-装饰器
    Python-内置函数
    CPU性能测试
    python-生成随机字符
    python-布尔值
    python学习-day3
  • 原文地址:https://www.cnblogs.com/qmfsun/p/3847529.html
Copyright © 2011-2022 走看看