获取主键
1. 查询主键的两种常用方法
Oracle 的主键信息存储在以下两个视图中:
-
USER_CONSTRAINTS
:存储当前用户下所有表的约束信息(如主键、外键等)。 -
USER_CONS_COLUMNS
:存储约束对应的列信息。
方法 1:直接查询主键列
sql
SELECT
cols.column_name
FROM
user_constraints cons
JOIN
user_cons_columns cols
ON
cons.constraint_name = cols.constraint_name
WHERE
cons.table_name = 'AI_TOOLS' -- 替换为你的表名
AND cons.constraint_type = 'P'; -- 'P' 表示主键

方法 2:分步查询
先查询主键约束名:
sql
SELECT
constraint_name
FROM
user_constraints
WHERE
table_name = 'YOUR_TABLE_NAME'
AND constraint_type = 'P';
再根据约束名查询列名:
sql
SELECT
column_name
FROM
user_cons_columns
WHERE
constraint_name = 'YOUR_PK_CONSTRAINT_NAME'; -- 替换为第一步查到的约束名
2. 复合主键的情况
如果主键由多列组成(复合主键),查询结果会返回多行,按列在键中的顺序排序
sql
SELECT
cols.column_name,
cols.position -- 列在键中的位置(从1开始)
FROM
user_constraints cons
JOIN
user_cons_columns cols
ON
cons.constraint_name = cols.constraint_name
WHERE
cons.table_name = 'YOUR_TABLE_NAME'
AND cons.constraint_type = 'P'
ORDER BY
cols.position;
3. 查看其他用户/所有主键(需要权限)
使用 ALL_CONSTRAINTS
和 ALL_CONS_COLUMNS
:
sql
SELECT
cols.column_name
FROM
all_constraints cons
JOIN
all_cons_columns cols
ON
cons.constraint_name = cols.constraint_name
WHERE
cons.table_name = 'YOUR_TABLE_NAME'
AND cons.owner = 'AI_TOOLS' -- 表所属的用户
AND cons.constraint_type = 'P';
4. 注意事项
-
表名大小写:Oracle 默认以大写存储对象名,查询时建议使用大写表名(除非创建时用了引号强制小写)。
-
权限问题 :访问
DBA_
或ALL_
视图需要相应权限。
获取字段名称
1. 查询表的基本字段信息
使用 USER_TAB_COLUMNS
视图(当前用户下的表字段信息):
sql
SELECT
column_name, -- 列名
data_type, -- 数据类型(如VARCHAR2、NUMBER等)
data_length, -- 数据长度
data_precision, -- 数字类型的精度
data_scale, -- 数字类型的小数位数
nullable -- 是否允许NULL('Y'允许,'N'不允许)
FROM
user_tab_columns
WHERE
table_name = 'AI_TOOLS'; -- 替换为你的表名(需大写)

2. 查询其他用户或所有表的字段信息
ALL_TAB_COLUMNS
:查询你有权限访问的所有表的字段信息。
sql
SELECT
column_name,
data_type,
data_length
FROM
all_tab_columns
WHERE
table_name = 'YOUR_TABLE_NAME'
AND owner = 'TABLE_OWNER'; -- 表所属的用户名(需大写)
DBA_TAB_COLUMNS
(需 DBA 权限):
sql
SELECT
column_name,
data_type
FROM
dba_tab_columns
WHERE
table_name = 'YOUR_TABLE_NAME';
3. 查询字段的注释
使用 USER_COL_COMMENTS
视图(当前用户下的字段注释):
sql
SELECT
column_name,
comments -- 字段注释
FROM
user_col_comments
WHERE
table_name = 'YOUR_TABLE_NAME';
4. 生成建表语句(包含字段定义)
使用 Oracle 提供的 DBMS_METADATA
包生成完整的表定义(包括字段、主键、约束等):
sql
SELECT
dbms_metadata.get_ddl('TABLE', 'YOUR_TABLE_NAME')
FROM
dual;
5. 快速查看表结构(类似DESCRIBE
命令)
在 SQL*Plus 或 SQLcl 中可以直接使用 DESC
命令:
DESC YOUR_TABLE_NAME;
6. 导出字段信息到文件
在 SQL*Plus 中可以使用 SPOOL
命令导出结果到文件:
SPOOL /path/to/output.txt
SELECT column_name, data_type, data_length FROM user_tab_columns WHERE table_name = 'YOUR_TABLE_NAME';
SPOOL OFF
注意事项
-
表名大小写:Oracle 默认以大写存储对象名,查询时需用大写表名(除非建表时用了引号强制小写)。
-
权限问题:
-
访问
ALL_TAB_COLUMNS
需要访问其他用户表的权限。 -
访问
DBA_TAB_COLUMNS
需要 DBA 权限。
-
-
扩展需求 :若需要字段的默认值、虚拟列等高级信息,可查询
DATA_DEFAULT
和VIRTUAL_COLUMN
列。