创建了两个表:
人员表
CREATE TABLE Persons
(
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Firstname TEXT,
Lastname TEXT,
Surname TEXT,
DateOfBirth TEXT
)
和员工表
CREATE TABLE Employees
(
Id INTEGER PRIMARY KEY AUTOINCREMENT,
PersonId INTEGER NOT NULL,
PersonnelNumber INTEGER NOT NULL,
PostId INTEGER NOT NULL,
FOREIGN KEY (PersonId) REFERENCES Persons (Id) ON DELETE CASCADE
)
PersonId 列是指向 Persons 表中的 Id 列的外键。
有一个带有文本框的 WindowsForms 表单,需要将其中的数据填写到这两个表中。问题是我不知道如何通过人员中的 ID 填充人员和员工。在第一个表中,填写了字段 FirstName、Lastname、Surname 和 DateOfBirth。
public void CreateEmployee()
{
using (var connection = new SqliteConnection("Data Source=mainDb.db"))
{
connection.Open();
try
{
SqliteCommand command = new SqliteCommand();
command.Connection = connection;
command.CommandText = "INSERT INTO Persons (Firstname, Lastname, Surname, DateOfBirth) VALUES (@Firstname, @Lastname, @Surname, @DateOfBirth)";
command.Parameters.AddWithValue("@Firstname", createEmployeeFirstNameInputBox.Text);
command.Parameters.AddWithValue("@Lastname", createEmployeeLastNameInputBox.Text);
command.Parameters.AddWithValue("@Surname", createEmployeeSurNameInputBox.Text);
command.Parameters.AddWithValue("@DateOfBirth", createEmployeeDateOfBirthInputBox.Text);
command.ExecuteNonQuery();
MessageBox.Show("Сотрудник создан");
}
catch (Exception ex)
{
MessageBox.Show($"Не удалось создать сотрудника:\n\"{ex.Message}\"\n" +
$"Обратитесь к системному администратору для её устранения.",
"Нет соединения с Базой Данных", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
DataBase.CloseConnection();
}
}
在Employees 表中,必须使用表单中的数据填写PersonId、PersonnelNumber 和PostId 列。如何正确编写查询,以便使用关联的 ID 同时填充两个表?
在 SQL 格式中,查询如下所示:
也就是说,当向第二个表插入记录时,我们从刚刚输入的数据值中获取第一个表新生成的主键值。
然而,表中缺少唯一索引是非常令人不安的。这很容易导致出现完全重复的记录,仅自增主键的值不同。需要重新分析主题领域特征或其组合的唯一性,对图表进行更改,并在此基础上更新/补充具有唯一索引的表结构。