如何使用Oracle SQL在单语句中创建带多索引的表
Oracle SQL 创建表同时建多列索引的正确方法
你写的那种在CREATE TABLE里直接加INDEX子句的写法行不通,Oracle不支持这种语法。要实现创建表的同时为多列建普通索引,有两种实用方案:
方案1:先建表,再连续创建索引
这是最常用的方式,虽然是多条SQL,但可以在同一个脚本里一次性执行:
CREATE TABLE members( member_id INT GENERATED BY DEFAULT AS IDENTITY, first_name VARCHAR2(100) NOT NULL, last_name VARCHAR2(100) NOT NULL, gender CHAR(1) NOT NULL, dob DATE NOT NULL, email VARCHAR2(255) NOT NULL, PRIMARY KEY(member_id) ); CREATE INDEX members_last_name_i ON members(last_name); CREATE INDEX members_dob_i ON members(dob);
方案2:用PL/SQL块实现单语句执行
如果必须用单条语句完成所有操作,可以把表和索引的创建逻辑放进PL/SQL块里:
BEGIN EXECUTE IMMEDIATE ' CREATE TABLE members( member_id INT GENERATED BY DEFAULT AS IDENTITY, first_name VARCHAR2(100) NOT NULL, last_name VARCHAR2(100) NOT NULL, gender CHAR(1) NOT NULL, dob DATE NOT NULL, email VARCHAR2(255) NOT NULL, PRIMARY KEY(member_id) )'; EXECUTE IMMEDIATE 'CREATE INDEX members_last_name_i ON members(last_name)'; EXECUTE IMMEDIATE 'CREATE INDEX members_dob_i ON members(dob)'; END; /
额外说明:用约束自动生成索引
如果你的业务需要这些列是唯一的(比如不允许重复的last_name),可以在CREATE TABLE里加UNIQUE约束,Oracle会自动为这些约束创建唯一索引:
CREATE TABLE members( member_id INT GENERATED BY DEFAULT AS IDENTITY, first_name VARCHAR2(100) NOT NULL, last_name VARCHAR2(100) NOT NULL, gender CHAR(1) NOT NULL, dob DATE NOT NULL, email VARCHAR2(255) NOT NULL, PRIMARY KEY(member_id), UNIQUE(last_name), UNIQUE(dob) );
但要注意,这种方式只适用于需要唯一性的场景,普通无约束的索引没法这么搞。
内容的提问来源于stack exchange,提问作者Qaswed
相关产品推荐
相关产品推荐

