如何在phpmyadmin中创建外键

53

我想在我的患者表中将doctorid设置为外键。

我已经创建了所有的表,主要问题是当我进入表格 > 结构 > 关系视图时,只有主键出现,我可以创建一个外键(它已经是我想要保留的特定表的主键 - 即患者表。患者可以更改,但医生ID(我也有一个医生表)不可更改)。

我还有另一张表,其中有两个复合主键(medicineid和patientid),在关系视图中,它使我能够同时更改这两个键。

我必须更改患者表中doctor ID的索引吗? 由于患者ID是患者表的主键,因此两者都不能成为主键 - 医生是外键。

table

我希望有人能够帮助。

敬祝好运


生成外键需要先创建该字段的索引。创建索引后,进入关系视图,您将看到该字段与主键一起显示。 - Web Artisan
5个回答

71

您可以按照传统的方式进行操作...使用类似以下SQL语句的方式

ALTER TABLE table_1_name
    ADD CONSTRAINT fk_foreign_key_name
    FOREIGN KEY (table_1_column_name)
    REFERENCES target_table(target_table_column_name);

例如: 如果您有一个名为 books 的表,其中包含指向 users 表中 id 列的 created_by 列:
ALTER TABLE books
    ADD CONSTRAINT books_FK_1
    FOREIGN KEY (created_by)
    REFERENCES users(id);

假设这些键已经存在于相关的表中


嗨 Jon!谢谢你的回答!我是 PHP 的新手,这是我在使用 Visual Studio 时使用 SQL 建立关联的方法,但我想确保我做得对-如果我使用 SQL 语句,这会在表中创建外键吗?我需要在病人表的 doctor id 列进行任何更改吗? - laurajs
1
ALTER TABLE Patient ADD CONSTRAINT fk_to_Doctorid FOREIGN KEY (Doctorid) REFERENCES Doctor(DoctorId); - 这个正确吗? - laurajs
是的,SQL语句直接影响底层结构:PHPMyAdmin只是一个为您生成SQL语句的图形界面。只要doctor_id表已经索引,您就不需要更改任何内容。如果没有索引,则需要按照@Alok的答案将其转换为索引。 - Jon Story
Jon,谢谢你——非常好的答案——感谢你的出色指导和帮助。 - laurajs
这现在可以工作了,约翰,谢谢你。我现在需要为特定的关系给约束名一个唯一的名称,此外,您会为ON DELETE和ON UPDATE提供哪些选项? - laurajs
显示剩余5条评论

41

为应用外键约束,必须对关键字进行索引。按照以下步骤操作。

  1. 打开表结构(第二个选项卡)。
  2. 查看最后一列的操作,其中有多个操作选项。单击索引,这将使该列被索引。
  3. 打开关系视图并添加外键约束。

现在,您可以将DOCTOR_ID指定为外键。


谢谢Alok!非常好的回答。我刚开始使用php,所以这很有帮助 - 如果我选择使用sql语句创建外键 - ALTER TABLE Patient ADD CONSTRAINT fk_to_Doctorid FOREIGN KEY (Doctorid) REFERENCES Doctor(DoctorId); 在此之前,我是否需要为该列创建索引? - laurajs
不行,必须在添加外键约束之前对该列进行索引。您可以使用MySQL语句添加索引。请参考:http://dev.mysql.com/doc/refman/5.7/en/create-index.html。 - Alok Patel
我已经建立了索引并运行了该语句 - 这是在之后出现的 - 这是否意味着它成功了?- MySQL 返回了一个空结果集(即零行)。 (查询时间为0.2090秒) - laurajs
是的!请在关系视图中确认! - Alok Patel
1
很棒的回答,@Alok。 - mLstudent33

30
要创建关系,必须将表格中的 存储引擎 更改为 InnoDB 。您可以在操作选项卡中进行编辑。

Storage Engine Configuration

然后,您需要确保主表中的 id 列已被索引。它应该出现在结构选项卡中的索引部分。

Index list

最后,在结构选项卡中可以看到关系视图选项。当进行编辑时,您将能够选择外部表中的父列以创建关系。

enter image description here

请参考附件,希望对大家有用。

更改存储引擎会锁定事务中的表格。锁定期取决于服务器。在更改存储引擎时请记住这一点。 - Rahul Kumar

8
创建一个categories表:
CREATE TABLE categories(
    cat_id int not null auto_increment primary key,
    cat_name varchar(255) not null,
    cat_description text
) ENGINE=InnoDB;

创建一个 products 表并引用 categories 表:
CREATE TABLE products(
   prd_id int not null auto_increment primary key,
   prd_name varchar(355) not null,
   prd_price decimal,
   cat_id int not null,
   FOREIGN KEY fk_cat(cat_id)
   REFERENCES categories(cat_id)
   ON UPDATE CASCADE
   ON DELETE RESTRICT
)ENGINE=InnoDB;

创建一个名为vendors的表格,然后修改products表格:
CREATE TABLE vendors(
    vdr_id int not null auto_increment primary key,
    vdr_name varchar(255)
)ENGINE=InnoDB;
 
ALTER TABLE products 
ADD COLUMN vdr_id int not null AFTER cat_id;

为了将外键(引用vendors表)添加到products表中,可以使用以下语句:
ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;

如果您想要删除该密钥,则需要执行以下操作:
ALTER TABLE table_name 
DROP FOREIGN KEY constraint_name;

Great Yagnik,非常感谢您提供的所有信息和帮助 :) - laurajs

3
在phpmyadmin中,转到“结构”选项卡,在下面的图像中选择“关系视图”。在这里,您将找到表格形式以添加外键约束名称,当前表列,外键数据库,表和列。

enter image description here


如果存储引擎是InnoDB,则关联视图选项才可用。您可以在操作选项卡中进行编辑。 - Westy92

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接