创建表时如何使用references
关键字?
假设我要创建两个表person
和hobby
,我希望爱好表ID引用人的ID?
person table
- id
- name
hobby
- id
- person_id
- hobby_name
我该怎么做?
答案 0 :(得分:31)
与此类似地创建爱好表:
CREATE TABLE hobby (
id INT NOT NULL AUTO_INCREMENT,
person_id INT NOT NULL,
hobby_name VARCHAR(255),
PRIMARY KEY(id),
FOREIGN KEY(person_id) REFERENCES person(id))
答案 1 :(得分:6)
以下是directly from MySQL website示例:
CREATE TABLE parent (id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
) ENGINE=INNODB;
答案 2 :(得分:6)
CREATE TABLE person (person_id INT NOT NULL,
PRIMARY KEY (person_id));
CREATE TABLE hobby (hobby_id INT NOT NULL, person_id INT NOT NULL,
PRIMARY KEY(hobby_id),
FOREIGN KEY(person_id) REFERENCES person(person_id));
references关键字用于定义外键关系中使用的表和列。这意味着爱好表中的记录必须具有person表中存在的person_id,否则在插入时您将收到该键不存在的错误。
要回答上面关于“ON DELETE CASCADE”的内容的问题,它允许您删除父键记录(亲自)及其相应的子记录(爱好),而不必先删除所有子记录。 / p>
为了澄清,如果您有子记录附加到主键条目,并且您尝试删除主键条目,如:
DELETE FROM person where person_id = 1;
没有DELETE ON CASCADE,如果业余爱好中的任何记录的person_id为1,您将收到错误。在执行上述删除之前,您将首先删除所有这些记录。使用DELETE ON CASCADE时,上述删除将成功并自动删除链接到从主键表中删除的person_id的表爱好表中的任何和所有记录。
答案 3 :(得分:1)
引用关键字实际上用于了解外键的来源。 这意味着哪个是表名,该表中的名称是什么。
我说这是对的:
def autv(self):
if not self._utv:
raise FileNotFoundError("No data loaded.")
ut = self._utv
try:
self._utv = (ut
.rdd
.map(lambda x: (x.id, (x.t, x.w)))
.reduceByKey(lambda accum, x: (accum[0] + x[0], accum[1] + x[1]))
.map(lambda row: Row(user_id=row[0],
weight=row[1][1],
topics=row[1][0]))
.toDF()).cache()
return self
except AttributeError as e:
logging.error(e)
return None
然后,看看这一行: FOREIGN KEY(person_id)参考人(person_id));
这里person_id是外键,它来自人员表,在该表中,它的名字是person_id ... 就是这样。
答案 4 :(得分:-1)
以下是如何使用它的示例。
create table hobby(id int references person(id),person_id int,hobby_varchar(20), primary key(id));
就其含义而言,references
允许我们指定外键引用的目标表列。