Re: checking data integrity in a recursive table
От | Bruce Momjian |
---|---|
Тема | Re: checking data integrity in a recursive table |
Дата | |
Msg-id | 200301310532.h0V5W4G11349@candle.pha.pa.us обсуждение исходный текст |
Ответ на | checking data integrity in a recursive table ("Luke Pascoe" <luke.p@kmg.co.nz>) |
Список | pgsql-sql |
Luke Pascoe wrote: > Hi, I have a table that references itself to create a tree-like structure, > eg: > CREATE TABLE tree ( > id SERIAL NOT NULL, > name VARCHAR(255) NOT NULL, > parent INT NULL, > customer IN NOT NULL, > CONSTRAINT parent_key... > CONSTRAINT customer_fk FOREIGN KEY (customer) REFERENCES customer > ); > ALTER TABLE tree ADD CONSTRAINT FOREIGN KEY (parent) REFERENCES tree; > > As you can see tree also references the customer table. > > What I need is a CHECK that will ensuer that any given "tree" row has the > same customer as its parent. > Remember that "parent" can also be NULL. > > Or would this be better done as a trigger? Good question. I don't think you can do actualy SQL lookups in a CHECK. I think you will need a trigger, either in pl/pgsql or in C using SPI to issue the lookup queries. You can have a CHECK clause that deals with multiple columns: CREATE TABLE friend2 ( firstname CHAR(15), lastname CHAR(20), city CHAR(15), state CHAR(2) CHECK (length(trim(state)) = 2), age INTEGER CHECK (age >= 0), gender CHAR(1) CHECK (gender IN ('M','F')), last_met DATE CHECK (last_met BETWEEN'1950-01-01' AND CURRENT_DATE), CHECK (upper(trim(firstname))!= 'ED' OR upper(trim(lastname)) != 'RIVERS')); However, that doesn't help you because you can't reference a column in another row of the same table. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001+ If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania19073
В списке pgsql-sql по дате отправления: