我有两个表:国家和地区。
CREATE TABLE Countries( id SERIAL, name VARCHAR(40) NOT NULL, PRIMARY KEY(id) ) CREATE TABLE Regions( id SERIAL, countryId SERIAL, name VARCHAR(40) NOT NULL, PRIMARY KEY(id ), FOREIGN KEY(countryId) REFERENCES Countries(id) )
当我插入区域时,我希望如果我不提countryId,我会停下来,但是countryId会自动递增。有什么方法可以让我自动停止进行插入吗?
countryId
下表我设置countryID为SERIAL NOT NULL不能解决问题。
countryID
SERIAL NOT NULL
CREATE TABLE Pigeons( id SERIAL, countryId SERIAL NOT NULL, name VARCHAR(40) NOT NULL, PRIMARY KEY(id ), FOREIGN KEY(countryId) REFERENCES Countries(id) )
以下内容解决了该问题,但我认为这在技术上是不正确的,因为我的序列号可能大于2 ^ 31,但int永远不会> = 2 ^ 31。
CREATE TABLE Legions( id SERIAL, countryId INT NOT NULL, name VARCHAR(40) NOT NULL PRIMARY KEY(id ), FOREIGN KEY(countryId) REFERENCES Countries(id) )
这里正确的方法是什么?
我会建议:
CREATE TABLE country( country_id serial PRIMARY KEY , country text NOT NULL ); CREATE TABLE region( region_id serial PRIMARY KEY , country_id int NOT NULL REFERENCES country , region text NOT NULL );
id
name
a的基础类型serial是integer。创建引用列integer。 由于有外键引用,region.country_id因此只能保存country.country_id(或NULL)中存在的值。您无需考虑有关值> 2 ^ 31的问题。
serial
integer
region.country_id
country.country_id
NULL
演示PK和FK定义的较短语法(可选)。阅读上的手册CREATE TABLE。
CREATE TABLE