Oracle建表语句示例

Oracle建表语句示例

表一:EMPLOYEE_INFO

bash 复制代码
-- 1. 删除表(兼容DROP IF EXISTS,存在则删)
DECLARE
  v_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_count FROM USER_TABLES WHERE TABLE_NAME = 'EMPLOYEE_INFO';
  IF v_count > 0 THEN
    EXECUTE IMMEDIATE 'DROP TABLE EMPLOYEE_INFO CASCADE CONSTRAINTS';
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    NULL;
END;
/

-- 2. 删除序列(存在则删,避免建序列报错)
DECLARE
  v_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_count FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'SEQ_EMPLOYEE_INFO_ID';
  IF v_count > 0 THEN
    EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_EMPLOYEE_INFO_ID';
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    NULL;
END;
/

-- 3. 创建自增序列:起始值从1开始,步长1(核心修改:START WITH 1)
CREATE SEQUENCE SEQ_EMPLOYEE_INFO_ID
  START WITH 1
  INCREMENT BY 1
  MINVALUE 1
  NOMAXVALUE
  NOCYCLE
  NOCACHE;

-- 4. 建表语句(保留所有字段+主键+注释,无语法错)
CREATE TABLE EMPLOYEE_INFO (
  ID NUMBER(19) NOT NULL,
  NAME VARCHAR2(1000) DEFAULT NULL,
  POSITION VARCHAR2(1000) DEFAULT NULL,
  COMPANY VARCHAR2(1000) DEFAULT NULL,
  EMAIL VARCHAR2(1000) DEFAULT NULL,
  PHONE VARCHAR2(1000) DEFAULT NULL,
  IDCARD VARCHAR2(1000) DEFAULT NULL,
  OFFICER_CARD VARCHAR2(1000) DEFAULT NULL,
  PASSPORT VARCHAR2(1000) DEFAULT NULL,
  CREDIT_CARD VARCHAR2(1000) DEFAULT NULL,
  ADDRESS VARCHAR2(1000) DEFAULT NULL,
  PRIMARY KEY (ID)
) 
TABLESPACE USERS
LOGGING
NOCOMPRESS
NOCACHE;
-- 银行卡号字段注释
COMMENT ON COLUMN EMPLOYEE_INFO.CREDIT_CARD IS '银行卡号';

-- 5. 创建触发器(ID非空则不触发,指定ID插入不报错,彻底解决ORA-04098)
CREATE OR REPLACE TRIGGER TRG_EMPLOYEE_INFO_ID
BEFORE INSERT ON EMPLOYEE_INFO
FOR EACH ROW
WHEN (NEW.ID IS NULL)
BEGIN
  SELECT SEQ_EMPLOYEE_INFO_ID.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
/

-- 6. 插入10条原始数据(手动指定ID1-10,触发器不干预)
INSERT INTO EMPLOYEE_INFO (ID, NAME, POSITION, COMPANY, EMAIL, PHONE, IDCARD, OFFICER_CARD, PASSPORT, CREDIT_CARD, ADDRESS) 
VALUES (1, '胡小可', '测试工程师', '北京安全网络技术有限公司', 'hmf1@yahoo.com', '15652996961', '210302199608124861', '武水电字第3632735号', 'BWP018930701', '6225881010845071', '北京市朝阳区立水桥南旭辉奥都6-903');
INSERT INTO EMPLOYEE_INFO (ID, NAME, POSITION, COMPANY, EMAIL, PHONE, IDCARD, OFFICER_CARD, PASSPORT, CREDIT_CARD, ADDRESS) 
VALUES (2, '陈坤', '开发工程师', '北京安全网络技术有限公司', 'hmf2@yahoo.com', '15652996962', '210302199608124862', '武水电字第3632735号', 'BWP018930702', '6225881010845072', '北京市朝阳区明天第一城6-901');
INSERT INTO EMPLOYEE_INFO (ID, NAME, POSITION, COMPANY, EMAIL, PHONE, IDCARD, OFFICER_CARD, PASSPORT, CREDIT_CARD, ADDRESS) 
VALUES (3, '王宁', '开发工程师', '北京安全网络技术有限公司', 'hmf3@yahoo.com', '15652996963', '210302199608124863', '武水电字第3632735号', 'BWP018930703', '6225881010845073', '北京市朝阳区明天第一城6-901');
INSERT INTO EMPLOYEE_INFO (ID, NAME, POSITION, COMPANY, EMAIL, PHONE, IDCARD, OFFICER_CARD, PASSPORT, CREDIT_CARD, ADDRESS) 
VALUES (4, '陈晓', '测试开发工程师', '北京安全网络技术有限公司', 'hmf4@yahoo.com', '15652996964', '210302199608124864', '武水电字第3632735号', 'BWP018930704', '6225881010845074', '北京市朝阳区立水桥南旭辉奥都6-903');
INSERT INTO EMPLOYEE_INFO (ID, NAME, POSITION, COMPANY, EMAIL, PHONE, IDCARD, OFFICER_CARD, PASSPORT, CREDIT_CARD, ADDRESS) 
VALUES (5, '郭建', '开发工程师', '北京安全网络技术有限公司', 'hmf5@yahoo.com', '15652996965', '210302199608124865', '武水电字第3632735号', 'BWP018930705', '6225881010845075', '北京市朝阳区明天第一城6-901');
INSERT INTO EMPLOYEE_INFO (ID, NAME, POSITION, COMPANY, EMAIL, PHONE, IDCARD, OFFICER_CARD, PASSPORT, CREDIT_CARD, ADDRESS) 
VALUES (6, '张恒', '测试工程师', '北京安全网络技术有限公司', 'hmf6@yahoo.com', '15652996966', '210302199608124866', '武水电字第3632735号', 'BWP018930706', '6225881010845076', '北京市朝阳区明天第一城6-901');
INSERT INTO EMPLOYEE_INFO (ID, NAME, POSITION, COMPANY, EMAIL, PHONE, IDCARD, OFFICER_CARD, PASSPORT, CREDIT_CARD, ADDRESS) 
VALUES (7, '陈盼', '开发工程师', '北京安全网络技术有限公司', 'hmf7@yahoo.com', '15652996967', '210302199608124867', '武水电字第3632735号', 'BWP018930707', '6225881010845077', '北京市朝阳区明天第一城6-901');
INSERT INTO EMPLOYEE_INFO (ID, NAME, POSITION, COMPANY, EMAIL, PHONE, IDCARD, OFFICER_CARD, PASSPORT, CREDIT_CARD, ADDRESS) 
VALUES (8, '王莹', '测试工程师', '北京安全网络技术有限公司', 'hmf8@yahoo.com', '15652996968', '210302199608124868', '武水电字第3632735号', 'BWP018930708', '6225881010845078', '北京市朝阳区明天第一城6-901');
INSERT INTO EMPLOYEE_INFO (ID, NAME, POSITION, COMPANY, EMAIL, PHONE, IDCARD, OFFICER_CARD, PASSPORT, CREDIT_CARD, ADDRESS) 
VALUES (9, '郑小', '开发工程师', '北京安全网络技术有限公司', 'hmf9@yahoo.com', '15652996969', '210302199608124869', '武水电字第3632735号', 'BWP018930709', '6225881010845079', '北京市朝阳区立水桥南旭辉奥都6-903');
INSERT INTO EMPLOYEE_INFO (ID, NAME, POSITION, COMPANY, EMAIL, PHONE, IDCARD, OFFICER_CARD, PASSPORT, CREDIT_CARD, ADDRESS) 
VALUES (10, '胡玫', '测试开发工程师', '北京安全网络技术有限公司', 'hmf0@yahoo.com', '15652996960', '210302199608124860', '武水电字第3632735号', 'BWP018930710', '6225881010845070', '北京市朝阳区明天第一城6-901');

-- 7. 提交事务(Oracle必须提交,数据才持久化)
COMMIT;

-- 8. 验证数据(可选,查看插入结果)
SELECT ID, NAME, COMPANY FROM EMPLOYEE_INFO;

表二:ID_CARD

bash 复制代码
-- 1. 删除表(Oracle兼容DROP IF EXISTS,存在则删)
DECLARE
  v_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_count FROM USER_TABLES WHERE TABLE_NAME = 'ID_CARD';
  IF v_count > 0 THEN
    EXECUTE IMMEDIATE 'DROP TABLE ID_CARD CASCADE CONSTRAINTS';
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    NULL;
END;
/

-- 2. 建表语句:适配Oracle类型,处理关键字from,移除MySQL专属配置
CREATE TABLE ID_CARD (
  ID_CARD VARCHAR2(255) DEFAULT NULL,
  PROVINCE VARCHAR2(255) DEFAULT NULL,
  "FROM" DATE DEFAULT NULL,  -- 核心:from是Oracle关键字,加双引号保留原字段名
  "TO" DATE DEFAULT NULL     -- to也是Oracle关键字,同样加双引号处理
) 
TABLESPACE USERS
LOGGING
NOCOMPRESS
NOCACHE;

-- 3. 插入原始数据:Oracle日期直接用字符串赋值,解析兼容YYYY-MM-DD格式
-- 修复后的插入语句:TO_DATE(字符串, 格式) 显式转换,核心格式符 YYYY-MM-DD
INSERT INTO ID_CARD (ID_CARD, PROVINCE, "FROM", "TO") 
VALUES ('460025198109101510', '海南省', TO_DATE('2021-09-10','YYYY-MM-DD'), TO_DATE('2041-09-10','YYYY-MM-DD'));
INSERT INTO ID_CARD (ID_CARD, PROVINCE, "FROM", "TO") 
VALUES ('110103198309102321', '北京', TO_DATE('2020-08-10','YYYY-MM-DD'), TO_DATE('2040-08-10','YYYY-MM-DD'));

-- 4. 提交事务(Oracle必须提交,数据才持久化)
COMMIT;

-- 5. 验证数据(可选,查看插入结果)
SELECT * FROM ID_CARD;

表三:TABLE1

java 复制代码
-- 1. 创建自增序列(Oracle通过「序列+触发器」实现MySQL的AUTO_INCREMENT自增主键)
CREATE SEQUENCE SEQ_TABLE1_ID
  START WITH 6  -- 对应MySQL的AUTO_INCREMENT = 6,下一个自增值从6开始
  INCREMENT BY 1  -- 每次自增1
  MINVALUE 1  -- 最小值
  NOMAXVALUE  -- 无最大值
  NOCYCLE  -- 不循环
  NOCACHE;  -- 不缓存序列值(避免断连丢失序列,测试/小表推荐)

-- 2. 建表语句(适配Oracle语法,移除MySQL专属配置)
CREATE TABLE TABLE1 (
  ID NUMBER(11) NOT NULL,  -- Oracle用NUMBER替代int,兼容数值范围
  NAME VARCHAR2(100) DEFAULT NULL,
  EMAIL VARCHAR2(100) DEFAULT NULL,
  AGE NUMBER(11) DEFAULT NULL,
  SEX VARCHAR2(100) DEFAULT NULL,
  ID_CARD VARCHAR2(100) DEFAULT NULL,
  MOBILE_PHONE VARCHAR2(100) DEFAULT NULL,
  VISA_CARD VARCHAR2(100) DEFAULT NULL,
  OFFICER_CARD VARCHAR2(100) DEFAULT NULL,
  ADDRESS VARCHAR2(100) DEFAULT NULL,
  PRIMARY KEY (ID)  -- 主键约束,Oracle无需指定USING BTREE(默认索引类型)
) 
TABLESPACE USERS  -- 默认表空间,可根据你的库修改
LOGGING
NOCOMPRESS;


-- 3. 插入原始数据(ID手动指定,触发器对手动传ID的行不生效,完全保留原数据)
INSERT INTO TABLE1 (ID, NAME, EMAIL, AGE, SEX, ID_CARD, MOBILE_PHONE, VISA_CARD, OFFICER_CARD, ADDRESS) 
VALUES (1, '陈欢', 'www5@163.com', 1, 'M', '460025198109101501', '13581696800', 'SYP618183458', '军字第00111209号', '北京市朝阳区立水桥北');
INSERT INTO TABLE1 (ID, NAME, EMAIL, AGE, SEX, ID_CARD, MOBILE_PHONE, VISA_CARD, OFFICER_CARD, ADDRESS) 
VALUES (2, '李小冉', 'www4@163.com', 11, 'M', '460025198109101502', '13581696801', 'SYP618183458', '军字第00111210号', '北京市朝阳区立水桥北test');
INSERT INTO TABLE1 (ID, NAME, EMAIL, AGE, SEX, ID_CARD, MOBILE_PHONE, VISA_CARD, OFFICER_CARD, ADDRESS) 
VALUES (3, '胡绍', 'www3@163.com', 28, 'M', '460025198109101503', '13581696802', 'SYP618183458', '军字第00111211号', '北京市朝阳区大屯北');
INSERT INTO TABLE1 (ID, NAME, EMAIL, AGE, SEX, ID_CARD, MOBILE_PHONE, VISA_CARD, OFFICER_CARD, ADDRESS) 
VALUES (4, '张军', 'www2@163.com', 32, 'M', '460025198109101504', '13581696803', 'SYP618183458', '军字第00111212号', '北京市朝阳区国贸');
INSERT INTO TABLE1 (ID, NAME, EMAIL, AGE, SEX, ID_CARD, MOBILE_PHONE, VISA_CARD, OFFICER_CARD, ADDRESS) 
VALUES (5, '李四', 'www1@163.com', 30, 'M', '460025198109101505', '13581696804', 'HTG709131954', '军字第00111213号', '北京市东城培新街');


-- 4. 验证数据(可选,执行后查看表中所有数据,与原MySQL一致)
SELECT * FROM TABLE1;

表四:CREDIT_CARD

java 复制代码
-- 建表语句(适配Oracle语法:类型、约束、字符集等)
CREATE TABLE CREDIT_CARD (
  CREDIT_CARD VARCHAR2(255) NOT NULL,  -- Oracle用VARCHAR2,替代MySQL的varchar
  TYPE VARCHAR2(255) DEFAULT NULL,
  AMOUNT NUMBER(15,2) DEFAULT NULL     -- Oracle用NUMBER,替代MySQL的double(15,2)
) 
TABLESPACE USERS  -- 指定表空间(默认USERS,可根据你的库修改)
LOGGING
NOCOMPRESS
NOCACHE;

-- 插入数据语句(Oracle字符串用单引号,语法与MySQL一致,直接复用)
INSERT INTO CREDIT_CARD (CREDIT_CARD, TYPE, AMOUNT) VALUES ('6225881010845033', '储蓄卡', 50000.00);
INSERT INTO CREDIT_CARD (CREDIT_CARD, TYPE, AMOUNT) VALUES ('6225881010845034', '储蓄卡', 3000.00);


-- 验证数据(可选,执行后可查看表中数据)
SELECT * FROM CREDIT_CARD;

表五:USERS

bash 复制代码
-- 1. 删除表(兼容DROP IF EXISTS,存在则删,带级联约束)
DECLARE
  v_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_count FROM USER_TABLES WHERE TABLE_NAME = 'USERS';
  IF v_count > 0 THEN
    EXECUTE IMMEDIATE 'DROP TABLE USERS CASCADE CONSTRAINTS';
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    NULL;
END;
/

-- 2. 删除自增序列(存在则删,避免建序列报错)
DECLARE
  v_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_count FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'SEQ_USERS_ID';
  IF v_count > 0 THEN
    EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_USERS_ID';
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    NULL;
END;
/

-- 3. 创建自增序列:严格对应MySQL的AUTO_INCREMENT = 123456813
CREATE SEQUENCE SEQ_USERS_ID
  START WITH 123456813
  INCREMENT BY 1
  MINVALUE 1
  NOMAXVALUE
  NOCYCLE
  NOCACHE;

-- 4. 建表语句:适配Oracle类型,保留所有字段注释,无MySQL专属配置
CREATE TABLE USERS (
  ID NUMBER(11) NOT NULL,
  NAME VARCHAR2(1000) DEFAULT NULL,
  EMAIL VARCHAR2(1000) DEFAULT NULL,
  AGE NUMBER(11) DEFAULT NULL,
  SEX VARCHAR2(1000) DEFAULT NULL,
  ID_CARD VARCHAR2(1000) DEFAULT NULL,
  MOBILE VARCHAR2(1000) DEFAULT NULL,
  V_CARD VARCHAR2(1000) DEFAULT NULL,
  OFFICE_CARD VARCHAR2(1000) DEFAULT NULL,
  ADDRESS VARCHAR2(1000) DEFAULT NULL,
  PRIMARY KEY (ID)
) 
TABLESPACE USERS
LOGGING
NOCOMPRESS
NOCACHE;

-- 5. 保留所有字段注释(对应MySQL的字段COMMENT)
COMMENT ON COLUMN USERS.ID IS '用户ID(主键自增)';
COMMENT ON COLUMN USERS.NAME IS '姓名';
COMMENT ON COLUMN USERS.EMAIL IS '电子邮箱';
COMMENT ON COLUMN USERS.AGE IS '年龄';
COMMENT ON COLUMN USERS.SEX IS '性别';
COMMENT ON COLUMN USERS.ID_CARD IS '身份证号码';
COMMENT ON COLUMN USERS.MOBILE IS '手机号码';
COMMENT ON COLUMN USERS.V_CARD IS '会员卡编号';
COMMENT ON COLUMN USERS.OFFICE_CARD IS '工牌编号';
COMMENT ON COLUMN USERS.ADDRESS IS '联系地址';
-- 保留表注释(对应MySQL的表级COMMENT)
COMMENT ON TABLE USERS IS '用户信息表';

-- 6. 创建触发器:ID非空则不触发,手动插ID不报错(彻底解决ORA-04098)
CREATE OR REPLACE TRIGGER TRG_USERS_ID
BEFORE INSERT ON USERS
FOR EACH ROW
WHEN (NEW.ID IS NULL)
BEGIN
  SELECT SEQ_USERS_ID.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
/

-- 7. 插入原始数据:手动指定ID1-5,触发器不干预,完全保留原数据
INSERT INTO USERS (ID, NAME, EMAIL, AGE, SEX, ID_CARD, MOBILE, V_CARD, OFFICE_CARD, ADDRESS) 
VALUES (1, '陈小欢', 'www5@yahoo.com', 1, 'M', '460025198109101510', '13581696800', '6225881010845071', '军字第00111209号', '北京市朝阳区立水桥北');
INSERT INTO USERS (ID, NAME, EMAIL, AGE, SEX, ID_CARD, MOBILE, V_CARD, OFFICE_CARD, ADDRESS) 
VALUES (2, '李小冉', 'www4@yahoo.com', 11, 'M', '460025198109101510', '13581696801', '6225881010845072', '军字第00111210号', '北京市朝阳区立水桥北test');
INSERT INTO USERS (ID, NAME, EMAIL, AGE, SEX, ID_CARD, MOBILE, V_CARD, OFFICE_CARD, ADDRESS) 
VALUES (3, '胡小可', 'www3@yahoo.com', 28, 'M', '460025198109101503', '13581696802', '6225881010845073', '军字第00111211号', '北京市朝阳区大屯北');
INSERT INTO USERS (ID, NAME, EMAIL, AGE, SEX, ID_CARD, MOBILE, V_CARD, OFFICE_CARD, ADDRESS) 
VALUES (4, '张小军', 'www2@yahoo.com', 45, 'M', '460025198109101504', '13581696803', '6225881010845074', '军字第00111212号', '北京市朝阳区国贸');
INSERT INTO USERS (ID, NAME, EMAIL, AGE, SEX, ID_CARD, MOBILE, V_CARD, OFFICE_CARD, ADDRESS) 
VALUES (5, '胡小芬', 'www1@yahoo.com', 30, 'M', '460025198109101505', '13581696804', '6225881010845075', '军字第00111213号', '北京市东城培新街');

-- 8. 提交事务(Oracle必须提交,数据才持久化)
COMMIT;

-- 9. 验证数据(可选,查看插入结果)
SELECT ID, NAME, EMAIL, AGE FROM USERS;
相关推荐
砚边数影3 小时前
数据可视化入门:Matplotlib 基础语法与折线图绘制
数据库·信息可视化·matplotlib·数据可视化·kingbase·数据库平替用金仓·金仓数据库
orange_tt4 小时前
Djiango配置Celery
数据库·sqlite
云小逸4 小时前
【nmap源码学习】 Nmap网络扫描工具深度解析:从基础参数到核心扫描逻辑
网络·数据库·学习
肉包_5114 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
霖霖总总5 小时前
[小技巧64]深入解析 MySQL InnoDB 的 Checkpoint 机制:原理、类型与调优
数据库·mysql
此刻你6 小时前
常用的 SQL 语句
数据库·sql·oracle
それども6 小时前
分库分表的事务问题 - 怎么实现事务
java·数据库·mysql
·云扬·6 小时前
MySQL Binlog 配置指南与核心作用解析
数据库·mysql·adb
天空属于哈夫克37 小时前
Java 版:利用外部群 API 实现自动“技术开课”倒计时提醒
数据库·python·mysql