2013-07-19 214 views
1

我被要求在SQL中创建一个表,并且我不确定其中一个表字段。SQL查询列表

我被要求创建一个具有以下信息的表格:

  • 三条地址线
  • 手机
  • 家庭电话
  • 日期修改后的
  • 人分类
  • 评论

这是人类的描述:

人员类别:包含在数据库中,(ID和说明) 简单的查找表,可以预先填充从这个数据脚本,无需从VB应用程序编辑和更新。类别描述为:客户端,工作者,评估者和未知。

有人可以向我解释这里需要什么吗?

UPDATE

这里是我的Person表当前脚本:

CREATE TABLE db_person.Person 
(
PersonID NUMBER NOT NULL, 
FirstName varchar(50) NOT NULL, 
LastName varchar(50) NOT NULL, 
AddressLine1 varchar(50), 
AddressLine2 varchar(50), 
AddressLine3 varchar(50), 
MobilePhone varchar(20), 
HomePhone varchar(20), 
DateModified DATE, 
PersonCategory varchar(50), 
Comment varchar(8000), 
PRIMARY KEY (PersonID) 
) 

我能有一定的帮助以创建PersonCategory的查找表并将其链接到的人表?

+0

写了它从我可以收集的是你需要创建一个数据库表这些字段将使用脚本中的数据填充。 –

回答

0

这意味着您需要为Person类别创建另一个表格。因此这两个表之间的一对多关系。

此外,由于人员的描述仅限于客户端,工作者,评估者或未知,您应该在脚本创建中使用关键字“CHECK”处理此问题。

CHECK (Description in ("Client", "Worker", "Assessor", "Unknown")) 
+0

你能解释一下这个检查代码吗?代码是否确保Description的值必须是“Client”,“Worker”,“Assessor”或“Unknown”?我可以将此代码放入存储过程中,以将值添加到Person表以确保PersonCategory必须是这些值之一吗? –

+0

是的。通过这种方式,您可以确保列描述包含“客户”,“工作者”,“评估者”或“未知”。没有其他的。即使您尝试在不使用任何软件的情况下直接插入数据库。 – TheEwook

0

所有你必须创建分类查找表的第一位。你可以用这样的脚本来创建它:

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [Categories](
    [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL, 
    [Description] [varchar](50) NOT NULL, 
CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING ON 
GO 

ALTER TABLE [Categories] ADD CONSTRAINT [DF_Categories_Id] DEFAULT (newid()) FOR [Id] 
GO 

,并与4点的描述来填充它:

INSERT INTO Categories ([Description]) 
VALUES ('Client') 

INSERT INTO Categories ([Description]) 
VALUES ('Worker') 

INSERT INTO Categories ([Description]) 
VALUES ('Assessor') 

INSERT INTO Categories ([Description]) 
VALUES ('Unknown') 

之后,你必须创建个人表,与类别表上的约束:

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [Persons](
    [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL, 
    [IdCategory] [uniqueidentifier] NOT NULL, 
    [FirstName] [varchar](50) NOT NULL, 
    [LastName] [varchar](50) NOT NULL, 
    [FirstAddress] [varchar](250) NULL, 
    [SecondAddress] [varchar](250) NULL, 
    [ThirdAddress] [varchar](250) NULL, 
    [HomePhone] [varchar](50) NULL, 
    [MobilePhone] [varchar](50) NULL, 
    [Modified] [datetime] NOT NULL, 
    [Comment] [varchar](500) NULL, 
CONSTRAINT [PK_Persons] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING ON 
GO 

ALTER TABLE [Persons] ADD CONSTRAINT [DF_Persons_Id] DEFAULT (newid()) FOR [Id] 
GO 

ALTER TABLE [Persons] WITH CHECK ADD CONSTRAINT [FK_Persons_Categories] FOREIGN KEY([IdCategory]) 
REFERENCES [Categories] ([Id]) 
GO 

ALTER TABLE [Persons] CHECK CONSTRAINT [FK_Persons_Categories] 
GO 

现在你有两个表:)

这些脚本运行Ø n Microsoft SQL Server。

PS:最好的做法是做多个地址和多部电话另一台;)

检索与SELECT数据,你可以这样做:

SELECT FirstName, LastName, Description AS Category 
FROM Persons INNER JOIN 
Categories ON Categories.Id = Persons.IdCategory 

如果您使用的NUMBER ID,请在NUMBER中更改IdCategory数据类型。在此之后,StoredProcedure的可能是这样的:

CREATE PROCEDURE [AddPerson] 
(
@Category varchar(50), 
@FirstName varchar(50), 
@LastName varchar(50), 
@FirstAddress varchar(250) = NULL, 
@SecondAddress varchar(250) = NULL, 
@ThirdAddress varchar(250) = NULL, 
@HomePhone varchar(50) = NULL, 
@MobilePhone varchar(50) = NULL, 
@Comment varchar(500) = NULL 
) 
AS BEGIN 
Declare @idCategory NUMBER 
Set @idCategory = SELECT Id FROM Categories WHERE Description = Category 

INSERT INTO Persons ([IdCategory], [FirstName], [LastName], 
    [FirstAddress], 
    [SecondAddress], 
    [ThirdAddress], 
    [HomePhone], 
    [MobilePhone], 
    [Modified], 
    [Comment]) 
VALUES (@idCategory, 
    @FirstName, 
    @LastName, 
    @FirstAddress, 
    @SecondAddress, 
    @ThirdAddress, 
    @HomePhone, 
    GETDATE(), 
    @MobilePhone, 
    @Comment) 

END 

GO 

我很抱歉,如果这个代码包含了一些错误,但我的记事本:)

+0

谢谢。我想使用存储过程代码将值插入Persons表中,我使用PersonCategory的值是什么?我使用什么名称,以及什么数据类型? –

+0

我使用存储过程编辑了我的答案,因为我不能在此评论中写太多字符;)请检查它:) – Alesanco