sql - SQL中的多值表没有足够的列
问题描述
例如,当我有一个人可以说的语言的多值表时。比方说,有 5 列用于存储语言。
CREATE TABLE Languages
(
PersonID int primary key, //this is FOREIGN KEY to a Person, "REFERENCES Person(ID)" for example
Lang1 varchar(30),
Lang2 varchar(30),
Lang3 varchar(30),
Lang4 varchar(30),
Lang5 varchar(30)
)
如果有人会说超过 5 种语言,有什么解决方案?
解决方案
您的设计已损坏,无法处理您描述的场景。您需要修复设计,这种情况的正常设计是:
CREATE TABLE Person
(
PersonID int identity (1,1) primary key,
Forename varchar(128),
Surname varchar(128)
-- etc etc
)
CREATE TABLE Language
(
LanguageID int primary key,
[Name] varchar(128)
-- etc etc
)
CREATE TABLE PersonLanguage
(
-- Optional to have a specific PK for a linking table - I prefer to
PersonLanguageID int identity (1,1) primary key,
PersonID int foreign key reference Person (PersonId),
LanguageID int foreign key reference Language (LanguageId)
)
然后您可以添加任意数量的语言,例如
-- First insert will give ID 1
insert into Person (Forename, Surname)
values ('Bob', 'Test');
-- Insert will give IDs 1-7
insert into Language ([Name])
values ('English'), ('Spanish'), ('French'), ('German'), ('Dutch'), ('Portuguese'), ('Greek');
-- Add as many languages as you like
insert into PersonLanguage (PersonId, LanguageId)
values (1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7);
推荐阅读
- python - 两个 DataFrame 图
- line - 如何打造流畅的线条?松脚本
- excel - Excell 2016 - 这个平均时间正确吗?
- c++ - 无法修改 const wchar * 的向量
- ios - Metal 资源的内存管理
- python - 如何使用 Python 通过 ApacheBeam 连接到 Oracle 数据库?
- r - 如何使用 plotly 和 R 绘制 3D 曲面和数据点?
- android - 在 Android 活动中设置结果,并在父活动在子活动之前完成时在祖父活动中接收
- javascript - 使用 vue-multiselect 添加更多动态下拉菜单
- docker - 如何在 Golang 映像中添加一些 Alpine 库(在 dockerfile 中)?