Вставить данные в столбец, который имеет два отношения - PullRequest
0 голосов
/ 19 сентября 2018

Итак, что я хочу сделать, это вставить данные в таблицу table1, которая имеет поле 'username', и это поле 'username' имеет две взаимосвязи: переход к таблице ученика и таблице учителя.Но когда я вставляю данные в пользовательскую таблицу, у меня возникает проблема, и проблема, вызванная этим полем «имя пользователя».Это вызвано тем, что данные поля 'username' не совпадают с уникальным ключом в таблице студента, и когда я изменяю его и делаю данные одинаковыми, я тоже получаю сообщение об ошибке, но на этот раз данные не совпадают суникальный в учительском столе.Итак, можно ли заставить это поле 'username' просто получить одну из таблиц, например, если одна из данных таблицы ученика и таблицы учителя находится в 'username', она все еще может использоваться.Или, может быть, это неправильно из-за плохой ERD?Вот мой ERD, если вы спрашиваете:

enter image description here

И я знаю, что это действительно очень плохая идея, но я сделал это имя вСтол учителя и стол ученика становятся уникальным ключом, потому что я не могу создать внешний ключ, если я этого не сделал.Пожалуйста, я очень благодарен за ваш ответ.

Вот ddl для этих 3 таблиц:

Стол ученика:

CREATE TABLE [dbo].[student](
[studentid] [int] IDENTITY(2016000001,1) NOT NULL,
[name] [varchar](50) NOT NULL,
[address] [text] NOT NULL,
[gender] [varchar](7) NOT NULL,
[dateofbirth] [date] NOT NULL,
[nohp] [varchar](13) NOT NULL,


CONSTRAINT [PK_student] PRIMARY KEY CLUSTERED 
(
[studentid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],


CONSTRAINT [IX_student] UNIQUE NONCLUSTERED 
(
[name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Стол учителя:

CREATE TABLE [dbo].[teacher](
[teacherid] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NOT NULL,
[gender] [varchar](7) NOT NULL,

CONSTRAINT [PK_teacher] PRIMARY KEY CLUSTERED 

(
    [teacherid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_teacher] UNIQUE NONCLUSTERED 
(
    [name] 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

Таблица пользователей:

CREATE TABLE [dbo].[user](
[userid] [int] IDENTITY(1,1) NOT NULL,
[username] [varchar](50) NOT NULL,
[password] [varchar](20) NOT NULL,
[role] [varchar](10) NOT NULL,
 CONSTRAINT [PK_user] PRIMARY KEY CLUSTERED 
(
    [userid] 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

ALTER TABLE [dbo].[user]  WITH CHECK ADD  CONSTRAINT [FK_user_student] FOREIGN KEY([username])
REFERENCES [dbo].[student] ([name])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[user] CHECK CONSTRAINT [FK_user_student]
GO

ALTER TABLE [dbo].[user]  WITH CHECK ADD  CONSTRAINT [FK_user_teacher] FOREIGN KEY([username])
REFERENCES [dbo].[teacher] ([name])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[user] CHECK CONSTRAINT [FK_user_teacher]
GO

1 Ответ

0 голосов
/ 19 сентября 2018

Основная проблема, с которой вы столкнулись, заключается в том, что ваша структура данных была не идеальной.Это мешало вам изменить чье-то имя.Я собрал быстрый пример чистого дизайна.Здесь много предположений.Я предположил, что люди имеют как имя, так и фамилию.Я был бы упущен, если бы я по крайней мере не указал, что предположение не всегда можно сделать.https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ Но для школьного проекта этого более чем достаточно.Я также сделал предположение, что адреса являются адресами США.Опять же, это не будет работать во многих реальных сценариях.И последнее предположение, что каждый может быть мужчиной или женщиной.В современном мире это не всегда так, но достаточно хорошо демонстрирует технику.

Вот как я, вероятно, сделал бы этот тип дизайна.Я бы посоветовал вам не просто слепо копировать это, а использовать его как идею для более правильной нормализации вашего дизайна.

create table Users
(
    UserID int identity not null
    , FirstName varchar(50) not null
    , LastName varchar(50) not null
    , AddressLine1 varchar(50)
    , AddressLine2 varchar(50)
    , City varchar(50)
    , ST char(2)
    , ZipCode varchar(9)
    , Gender char(1)
    , constraint PK_Users primary key clustered
        (
            UserID
        )
    , constraint CHK_Users_Gender
        CHECK (Gender in ('M', 'F'))
    , constraint CHK_Users_ZipCode
        CHECK (LEN(ZipCode) in (5,9)) --This ensures you have either the 5 or 9 digiti zip code
)


create table Student
(
    StudentID int identity not null
    , UserID int not null
    , BirthDate date
    , constraint PK_Student primary key clustered
        (
            StudentID
        )
    , constraint FK_Student_Users foreign key (UserID) references Users(UserID)
)

create table Teacher
(
    TeacherID int identity not null
    , constraint PK_Teacher primary key clustered
        (
            TeacherID
        )
    , constraint FK_Teacher_Users foreign key (TeacherID) references Users(UserID)
)
...