Làm thế nào để lấy cột khóa chính trong Oracle?


107

Tôi cần lấy tên của cột khóa chính.

Trong đầu vào, tôi chỉ có tên bảng.

Câu trả lời:


190
SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner
FROM all_constraints cons, all_cons_columns cols
WHERE cols.table_name = 'TABLE_NAME'
AND cons.constraint_type = 'P'
AND cons.constraint_name = cols.constraint_name
AND cons.owner = cols.owner
ORDER BY cols.table_name, cols.position;

Đảm bảo rằng 'TABLE_NAME' là chữ hoa vì Oracle lưu trữ tên bảng bằng chữ hoa.


Cảm ơn, Richie. Một câu hỏi nữa: làm thế nào để mã hóa 'P'? Tôi cần thực hiện điều này với "THỰC HIỆN NGAY LẬP TỨC". thnx một lần nữa.
Kirill A.

4
Tôi nghĩ rằng bạn sẽ chỉ cần đặt hai dấu nháy đơn tròn nó như thế này '' P ''
Greg Reynolds

Ngoài ra, bạn có thể trích dẫn nó bằng cách sử dụng q.
Burhan Ali,

bind_type

Làm việc cho tôi khi không có tiền tố lược đồ trước bảng! Cảm ơn!
FearlessFuture

20

Giống với câu trả lời từ 'Richie' nhưng ngắn gọn hơn một chút.

  1. Truy vấn chỉ cho các ràng buộc người dùng

    SELECT column_name FROM all_cons_columns WHERE constraint_name = (
      SELECT constraint_name FROM user_constraints 
      WHERE UPPER(table_name) = UPPER('tableName') AND CONSTRAINT_TYPE = 'P'
    );
  2. Truy vấn cho tất cả các ràng buộc

    SELECT column_name FROM all_cons_columns WHERE constraint_name = (
      SELECT constraint_name FROM all_constraints 
      WHERE UPPER(table_name) = UPPER('tableName') AND CONSTRAINT_TYPE = 'P'
    );

@FearlessFuture Đối với tôi, nó hoạt động tốt. Bạn có thể mô tả vấn đề của mình biểu cảm hơn một chút không?
Tên tôi-Là

Tôi không nhận được bất kỳ kết quả nào từ truy vấn này, nhưng tôi nhận được kết quả từ truy vấn cho câu trả lời được chấp nhận.
FearlessFuture

2
@FearlessFuture Tôi giả định rằng ràng buộc bạn đang tìm kiếm không phải là ràng buộc người dùng. Thay thế user_constraintsbởi all_constraints.
Tên tôi-Là

Điều này gây ra sự cố nếu bạn có một bảng có cùng tên trong hai hoặc nhiều lược đồ - cũng cần bao gồm cả chủ sở hữu trong tham gia: SELECT owner, column_name, position FROM all_cons_columns WHERE (owner, constraint_name) in (SELECT owner, constraint_name FROM all_constraints WHERE UPPER(table_name) = UPPER('&tableName') AND CONSTRAINT_TYPE = 'P') order by owner, position;
Mark Stewart

1
@MarkStewart Tôi kết hợp rằng Truy vấn thứ hai sẽ không hoạt động. Nhưng giải pháp của bạn không hiệu quả. Hãy thử: "SELECT cols.column_name AS KEY_STREAM, '=' AS KEY_CONDITION, cols.column_name as KEY_LOOKUP, '' AS KEY_STREAM2 FROM user_constraints cons, user_cons_columns cols WHERE cons.constraint_name = cols.constraint_name và CONSTRAINT_TYPE ='table_colboards ' = '<TABLE_NAME>' và cons.table_name = cols.table_name; "
Alexander Heim

2
Select constraint_name,constraint_type from user_constraints where table_name** **= TABLE_NAME ;

(Điều này sẽ liệt kê khóa chính và sau đó)

Select column_name,position from user_cons_cloumns where constraint_name=’PK_XYZ’; 

(Điều này sẽ cung cấp cho bạn cột, ở đây PK_XYZ là tên khóa ban đầu)


1

Hãy thử mã này Tại đây tôi đã tạo một bảng cho cột khóa chính trong oracle được gọi là kiểm tra và sau đó truy vấn

create table test
(
id int,
name varchar2(20),
city varchar2(20),
phone int,
constraint pk_id_name_city primary key (id,name,city)
);

SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner FROM all_constraints cons, all_cons_columns cols WHERE cols.table_name = 'TEST' AND cons.constraint_type = 'P' AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner  ORDER BY cols.table_name, cols.position;

0

Lưu tập lệnh sau dưới dạng một cái gì đó giống như findPK.sql.

set verify off
accept TABLE_NAME char prompt 'Table name>'

SELECT cols.column_name
FROM all_constraints cons NATURAL JOIN all_cons_columns cols
WHERE cons.constraint_type = 'P' AND table_name = UPPER('&TABLE_NAME');

Sau đó nó có thể được gọi bằng cách sử dụng

@findPK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.