Làm cách nào để xác định các bảng có khóa ngoại đối với một bảng cụ thể trong Sybase?


7

Tôi đang tìm kiếm (tốt nhất là) một câu lệnh SQL chọn tên bảng / và tên cột cho bất kỳ bảng nào có khóa ngoại với bảng đã cho trong Sybase. Tôi nghĩ rằng bằng cách nào đó có thể với các sys...bảng nhưng hoàn toàn mới đối với sybase, tôi không thể tạo ra đầu cũng như ngón chân của nó. Vì vậy, bất kỳ trợ giúp vào đúng hướng được đánh giá cao.

Chỉnh sửa: Vì lợi ích của sự hoàn thiện: SELECT @@VERSIONtrả về

'Doanh nghiệp máy chủ thích ứng / 15.0.3 / EBF 17156 ESD # 3 / P / Sun_auss4 / OS 5,8 / ase1503 / 2726/64-bit / FBO / Thứ Sáu 5 tháng 5 05:26:23 2010'

Chỉnh sửa 2
Cảm ơn rất nhiều về đề xuất của bạn, đặc biệt là nhận xét của Andrew Bickerton . Điều đó cho phép tôi xây dựng một câu lệnh chọn SQL thô sơ cho điểm bắt đầu để đi xa hơn.

Trong trường hợp người khác quan tâm đến nó, đây là:

select 
  fko.name    "Foreign key name",
  par.name    "Referenced table name",
  fk1.name || ' -> ' || pk1.name "Reference 1",
  fk2.name || ' -> ' || pk2.name "Reference 2",
  fk3.name || ' -> ' || pk3.name "Reference 3",
  fk4.name || ' -> ' || pk4.name "Reference 4"
from 
  sysobjects      tab                                       join
  sysconstraints  con on tab.id        = con.tableid        join
  sysobjects      fko on con.constrid  = fko.id             join
  sysreferences   ref on con.constrid  = ref.constrid       join
  sysobjects      par on par.id        = ref.reftabid  left join
  ---- 1. Column
  syscolumns      fk1 on ref.fokey1    = fk1.colid and
                         ref.tableid   = fk1.id        left join
  syscolumns      pk1 on ref.refkey1   = pk1.colid and
                         ref.reftabid  = pk1.id        left join
  ---- 2. Column
  syscolumns      fk2 on ref.fokey2    = fk2.colid and
                         ref.tableid   = fk2.id        left join
  syscolumns      pk2 on ref.refkey2   = pk2.colid and
                         ref.reftabid  = pk2.id        left join
  ---- 3. Column
  syscolumns      fk3 on ref.fokey3    = fk3.colid and
                         ref.tableid   = fk3.id        left join
  syscolumns      pk3 on ref.refkey3   = pk3.colid and
                         ref.reftabid  = pk3.id        left join
  ---- 4. Column
  syscolumns      fk4 on ref.fokey4    = fk4.colid and
                         ref.tableid   = fk4.id        left join
  syscolumns      pk4 on ref.refkey4   = pk4.colid and
                         ref.reftabid  = pk4.id        -- Et cetera...
where
  tab.type = 'U'      and
  tab.name = 'tq84_f' and
  fko.type = 'RI'

Chúc mừng cho thêm vào sql giải quyết của bạn! và vui mừng giúp bạn đi đúng hướng :-)
Andrew Bickerton

Câu trả lời:


4

Đã được một thời gian kể từ khi tôi làm việc trong sybase nhưng (từ bộ nhớ) sql sau đây sẽ chỉ cho bạn đi đúng hướng:

select *
from sysobjects so inner join syscolumns sc on so.id = sc.id 
where sc.name = 'field name'

bạn cũng có thể kiểm tra sách sybase trực tuyến (bảng hệ thống)


Vì René cần các bảng / cột cho khóa ngoại, anh ta cũng sẽ không cần sysconstraintở đó chứ?
Jack nói hãy thử topanswers.xyz

Không, tôi không nghĩ đó là sysconstraint, tôi nghĩ đó là sysreferences , sau đó tìm fokey1 đến fokey16
Andrew Bickerton

Tôi hiểu rồi :)
Jack nói hãy thử topanswers.xyz

@JackPDoureb Đã một vài năm kể từ khi tôi chơi đúng cách trong sybase, không thể nhớ bảng hệ thống nào sẽ bắt đầu bằng :-)
Andrew Bickerton


2

Lưu ý rằng cách tiếp cận được hiển thị ở trên (sử dụng sysconstraint và sysreferences) sẽ chỉ hoạt động nếu bạn có ràng buộc tham chiếu. Nếu bạn chỉ có một khóa ngoại được xác định nhưng không có ràng buộc, bạn sẽ không thấy nó ở đó. Để nhận tất cả các khóa ngoại liên quan đến một bảng nhất định, bạn có thể sử dụng syskey:

select  rtrim(object_name(k.id)),
    rtrim(substring(col_name(k.depid, depkey1),sign(keycnt),30))
    +rtrim(substring(', '+col_name(k.depid, depkey2),sign(keycnt-1),30))
    +rtrim(substring(', '+col_name(k.depid, depkey3),sign(keycnt-2),30))
    +rtrim(substring(', '+col_name(k.depid, depkey4),sign(keycnt-3),30))
    +rtrim(substring(', '+col_name(k.depid, depkey5),sign(keycnt-4),30))
    +rtrim(substring(', '+col_name(k.depid, depkey6),sign(keycnt-5),30))
    +rtrim(substring(', '+col_name(k.depid, depkey7),sign(keycnt-6),30))
    +rtrim(substring(', '+col_name(k.depid, depkey8),sign(keycnt-7),30)),
    rtrim(substring(col_name(k.id, key1),sign(keycnt),30))
    +rtrim(substring(', '+col_name(k.id, key2),sign(keycnt-1),30))
    +rtrim(substring(', '+col_name(k.id, key3),sign(keycnt-2),30))
    +rtrim(substring(', '+col_name(k.id, key4),sign(keycnt-3),30))
    +rtrim(substring(', '+col_name(k.id, key5),sign(keycnt-4),30))
    +rtrim(substring(', '+col_name(k.id, key6),sign(keycnt-5),30))
    +rtrim(substring(', '+col_name(k.id, key7),sign(keycnt-6),30))
    +rtrim(substring(', '+col_name(k.id, key8),sign(keycnt-7),30))
from    syskeys k
where   k.type = 2
and     k.depid = object_id('report')

(thay thế báo cáo bằng tên của bảng của bạn).

Trả về cột đầu tiên là tên của bảng có khóa ngoại trỏ vào bảng này. Cột thứ hai là danh sách các cột trong bảng này. Và các cột thứ ba là tên cột danh sách trong bảng tham chiếu.

Vì vậy, nếu bạn có một bảng người thông báo với cột rep_key là khóa ngoại để báo cáo.key, bạn sẽ nhận được một cái gì đó như thế này:

people_report        key       rep_key

1

Nếu bạn đang tìm kiếm chỉ tên bảng được tham chiếu, mã này sẽ giúp

SELECT o.name
FROM sysobjects o
WHERE EXISTS (  SELECT 1 FROM sysconstraints C
    JOIN sysreferences R ON R.constrid=C.constrid
    WHERE EXISTS ( SELECT 1 FROM sysobjects o2
        WHERE o2.id=C.tableid
        AND o2.name ='tableName' )  
AND R.reftabid=o.id )
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.