SQL外键关联报错排查请求:1对多关系下的建表语句问题
排查1对多关系数据库表的SQL外键错误
我帮你仔细检查了这段SQL,发现了几个导致外键报错和逻辑不符合1对多关系的问题,一个个给你拆解:
批处理分隔符缺失导致的语法错误
在SQL Server这类数据库中,创建数据库后直接执行use shop1会因为批处理顺序问题报错,需要用GO分隔独立的批处理语句。修正写法:create database shop1 GO use shop1 GO字段末尾多余逗号的语法错误
mathang表的最后一个字段Price int not null后面多了个逗号,这会直接导致表创建失败。修正后的表结构:create table mathang ( MatHangID INT primary key not null, TenMatHang varchar(50), SoLuong int not null, Price int not null )供应商与商品的1对多关系逻辑反转(核心外键错误)
你要实现的是1对多关系,但当前nhacungcap表把MatHangID作为主键,这变成了一个商品对应一个供应商的1对1关系,完全不符合需求。正确的设计应该是:- 供应商表用自身的ID作为主键
- 商品表添加供应商ID作为外键,关联供应商表
示例代码:
create table nhacungcap ( NhaCungCapID INT primary key not null, TenNhaCungCap varchar(50), DiaChi varchar(100), SoDienThoai varchar(50) -- 建议用varchar,避免电话号码带0或特殊字符的问题 ) create table mathang ( MatHangID INT primary key not null, TenMatHang varchar(50), SoLuong int not null, Price int not null, NhaCungCapID INT foreign key references nhacungcap(NhaCungCapID) )订单与客户的外键关联语法+逻辑双错误
donhang表的DonHangID int references to khachhang(KhachHangID)存在两个问题:- 语法错误:
references关键字后面不需要加to - 逻辑错误:订单和客户的1对多关系应该是一个客户对应多个订单,所以应该在订单表中添加
KhachHangID作为外键,而DonHangID是订单表自己的主键。当前写法把订单ID绑定到客户ID,导致每个客户只能有一个订单,完全不符合需求。修正后:
create table donhang ( DonHangID int not null primary key, TenDonHang varchar(50), SoLuong int, KhachHangID int foreign key references khachhang(KhachHangID) )- 语法错误:
修正后的完整SQL
create database shop1 GO use shop1 GO create table nhacungcap ( NhaCungCapID INT primary key not null, TenNhaCungCap varchar(50), DiaChi varchar(100), SoDienThoai varchar(50) ) GO create table mathang ( MatHangID INT primary key not null, TenMatHang varchar(50), SoLuong int not null, Price int not null, NhaCungCapID INT foreign key references nhacungcap(NhaCungCapID) ) GO create table khachhang ( KhachHangID int not null primary key, TenKhachHang varchar(50) not null, DiaChi varchar(100) not null, SoDienThoai varchar(50) not null ) GO create table donhang ( DonHangID int not null primary key, TenDonHang varchar(50), SoLuong int, KhachHangID int foreign key references khachhang(KhachHangID) ) GO
内容的提问来源于stack exchange,提问作者Phạm Thông
相关产品推荐
相关产品推荐

