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;