回答

收藏

在PostgreSQL中创建两种类型的表

技术问答 技术问答 144 人阅读 | 0 人回复 | 2023-09-13

我创建了两种类型:
/ V! T0 B* t$ I- t* `- E5 |Create  Type info_typ_1 AS (4 b8 Y# ?7 D% Y% X
Prod_id integer, 2 b  S5 F  }% t4 v" m9 x
category integer);
8 u- z* \8 f/ p& A" Q" v( zCreate Type movie_typ AS(
$ |# K: x: D: H& {title varchar(50),
. m: \) h' z$ k! i9 xactor varchar(50),
9 ], f- ?2 `! l. T8 v& }$ [price float);
4 t) |. }* v3 l' ?7 z* y+ o# |我想创建一个包含这两种类型的表。我知道对于由一种类型组成的表,它是:
& L/ E& [3 u3 d( m( X, _$ jCREATE TABLE Table1 of type1& B8 p' E7 A% B% [1 l
($ P) R; t' [- r7 q
  primary key(prod_id)
- ]. k0 C# d% b+ h);) `' M$ s7 ]7 t9 ^' S
对于我上面创建的两种类型,有什么方法可以做到这一点?5 R/ c" Z  h" c& L+ a
我尝试做的(错误的)是创建包含前两个的第三种类型:
2 r" V4 A' b# M" B# e. O/ X4 ACreate Type info_ AS (" {9 N( g; W3 C, c% w2 g
info info_typ_1,
0 p' L7 ], f, d& a# Q2 V: Y, e$ D7 |( mmovie movie_typ);# B/ D- n; x4 h" @; V
然后创建表:
0 X  _; w. b1 S" X, ZCREATE TABLE table1 of info_' q8 `( v0 p  d
($ J, f1 k/ G$ i, n
  primary key(Prod_id)% H+ F3 b6 b  \0 ]: A% Q
);
5 S  }- i: Z4 B& q0 e4 v但这是行不通的。我收到此错误:- y% |; |, ^. D
ERROR:  column "prod_id" named in key does not exist. P4 r0 K' j" q% ]
LINE 3:   primary key(Prod_id)" L$ ^% I6 Y# G# e& \8 m* {5 [- N
          ^3 f$ [" s& U) @1 O) J
********** Error **********
7 e* \- w6 Y- CERROR: column "prod_id" named in key does not exist
9 e& A) \6 C/ o2 h  s5 eSQL state: 42703: p7 ^! O% i3 K
Character: 43. R) ]9 }9 O" G4 U3 z7 O- _" w) I8 Z
               
4 U2 N# z( [3 y9 ?8 v解决方案:8 \& q* l0 E+ c8 H/ L( D: n2 W
               
; X  [. W$ r) B# [- W0 e! [/ N/ ?/ i6 Z5 E6 i4 W
1 _. R* l0 s& o% Y4 C6 f0 c1 _
                您不能成为prod_id的主键,table1因为唯一的列是两种复合类型info和movie。您不能在PRIMARY
1 v: ~5 C0 o+ O( I' t. ]2 yKEY子句中访问这些复合类型的基本类型。, [1 G# G* e: X/ E0 T* k
您尝试执行的操作在info或上有pk约束movie。, B- U0 Z0 j8 c2 d
除此以外,可能不是您要找的东西,这种方式是不可能的。
4 w$ C5 I  b# i- T; R  J- B3 x( t你可以实现的东西 像 这样用…
2 u$ W  z. }4 S* G遗产4 l0 I: g+ K! h
在这里,您可以继承多个父表(替代您的类型)。例子:$ C! v# ?& d( u% |% @' x
CREATE TABLE info (
6 W! U% b7 J5 L. k  prod_id integer
/ @* @! B  W2 z! k4 t7 W* k ,category integer" G( d6 G& v: [$ @5 W
);
. H/ D+ Z5 z# j1 yCREATE TABLE movie (( a9 W0 A9 l7 j
   title text2 q2 @. Y. S! G- U  N
  ,actor text& T) h6 n( a5 }6 g) Z& o
  ,price float
* J( j" @) e. [- y/ y2 {);
0 N: O' d4 N4 v- ACREATE  TABLE movie_info (
$ O$ F  @% ~) j5 e   PRIMARY KEY(prod_id)             -- now we can use the base column!
! ?; x* f) ]0 d& b' W* X# ~( @)/ ~6 \+ v" ]% q. [4 {3 Z7 T
INHERITS (info, movie);$ n. L( o& @' ^( z+ \( ], ?
INSERT INTO movie_info (prod_id, category, title, actor, price)
/ R% P! y5 v$ P( y5 I$ }VALUES (1, 2, 'who donnit?', 'James Dean', '15.90');
: R9 o% {  M9 j& U( M& T4 KSELECT * FROM movie_info;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则