Sql 追加查询错误

Sql 追加查询错误,sql,database,ms-access,insert,Sql,Database,Ms Access,Insert,我的Specialization表的主键很复杂,由两列组成:Specialization\u id和Specialization\u id(这是Specialization表的外键)。 我将通过创建现有专业的新专业来进行插入查询。 我的表中已经有一些专业,id=1的专业的主键看起来像(1,1)(2,1),id=2的专业的主键看起来像(1,2)(2,2)。 现在我将向专门化表中添加一个新的专门化,但这个专门化应该引用现有的专门化。 我的想法是 INSERT INTO Specializat

我的Specialization表的主键很复杂,由两列组成:Specialization\u id和Specialization\u id(这是Specialization表的外键)。 我将通过创建现有专业的新专业来进行插入查询。 我的表中已经有一些专业,id=1的专业的主键看起来像(1,1)(2,1),id=2的专业的主键看起来像(1,2)(2,2)。 现在我将向专门化表中添加一个新的专门化,但这个专门化应该引用现有的专门化。 我的想法是

    INSERT INTO Specialization ( Specialization_name, Specialization_id, Specialty_id )
VALUES( 'Network technologies','(SELECT Max(Specialization_id) FROM Specialization WHERE Specialty_id = '2')+1', '2');
我尝试过使用“”子句,但没有它,仍然会出现错误。
我应该在这里做什么?

在MySQL或ORACLE之类的数据库中,不应该以编程方式递增主键。相反,在设计数据库时,应该将字段设置为
AUTOINCREMENT

这会将您的
INSERT
语句更改为:

 INSERT INTO Specialization (Specialization_name, Specialty_id)
 VALUES('Network technologies', '2')
这不仅容易得多,而且更安全


编辑以添加:您确定
speciality\u id
是字符串吗?我认为这可能是某种数字。

在MySQL或ORACLE这样的数据库中,不应该通过编程方式递增主键。相反,在设计数据库时,应该将字段设置为
AUTOINCREMENT

这会将您的
INSERT
语句更改为:

 INSERT INTO Specialization (Specialization_name, Specialty_id)
 VALUES('Network technologies', '2')
这不仅容易得多,而且更安全


编辑以添加:您确定
speciality\u id
是字符串吗?我认为这可能是某种数字。

您的主要错误是引号,因为您的子查询被引号括起来,它将作为字符串而不是查询处理

此外,如果没有主查询,则不需要使用子查询:

INSERT INTO Specialization ( Specialization_name, Specialization_id, Specialty_id )
SELECT 'Network technologies' As a, Max(Specialization_id)+1 As b, 2 As c
FROM Specialization WHERE Specialty_id = 2

然而,正如dstudeba所说,依靠自动编号创建新ID可能更聪明。

您的主要错误是引号,因为您的子查询被引号括起来,它将作为字符串而不是查询处理

此外,如果没有主查询,则不需要使用子查询:

INSERT INTO Specialization ( Specialization_name, Specialization_id, Specialty_id )
SELECT 'Network technologies' As a, Max(Specialization_id)+1 As b, 2 As c
FROM Specialization WHERE Specialty_id = 2

然而,正如dstudeba所说,依靠自动编号创建新的ID可能更聪明。

我不是专家,但我不会正确使用复杂的主键。我之所以这样做是因为我在某个地方读到,当我们有一个组合时,我们必须有一个复杂的主键。@RaiseLtwiCe你指的是复合主键吗?如果正确,则不会自动递增复合主键,但也不会手动递增复合主键。您想对需要手动分配的主键执行什么操作?很抱歉输入错误,是的,我的主键是复合主键。我将试着大致解释一下情况。我有一个专门的餐桌。如果专业表中没有所需的专业,则专业表中引用某个专业的记录不可能存在。所以,据我所知,我的专业表的PK应该是(专业表的FK)。如果我增加专业id,我将丢失一些id,例如我有PK(1,1)(2,1),当我必须引用另一个专业id时,它将是(3,2)(4,2)而不是(1,2)(2,2)。实际上,当我写这个评论时,我有一个问题。我会失去这个(1,2)(2,2)作为PK真的很重要吗?@RaiseLtwiCe我真的认为你应该去和数据库设计师谈谈,从他们那里得到建议,因为这不是我设计数据库的方式。如果您自己设计数据库,那么使用复合主键应该有很好的理由。如果唯一的原因是确保每个
专业化都有一个现有的
专业化
,那么就有更简单、更标准的方法来实现。标准方法是将
Specialization\u id
设置为
Specialization
表中的外键,并将
Specialization\u id
设置为
Socialization
表中的主键。我不是专家,但我不会正确使用复杂的主键。我之所以这样做是因为我在某个地方读到,当我们有一个组合时,我们必须有一个复杂的主键。@RaiseLtwiCe你指的是复合主键吗?如果正确,则不会自动递增复合主键,但也不会手动递增复合主键。您想对需要手动分配的主键执行什么操作?很抱歉输入错误,是的,我的主键是复合主键。我将试着大致解释一下情况。我有一个专门的餐桌。如果专业表中没有所需的专业,则专业表中引用某个专业的记录不可能存在。所以,据我所知,我的专业表的PK应该是(专业表的FK)。如果我增加专业id,我将丢失一些id,例如我有PK(1,1)(2,1),当我必须引用另一个专业id时,它将是(3,2)(4,2)而不是(1,2)(2,2)。实际上,当我写这个评论时,我有一个问题。我会失去这个(1,2)(2,2)作为PK真的很重要吗?@RaiseLtwiCe我真的认为你应该去和数据库设计师谈谈,从他们那里得到建议,因为这不是我设计数据库的方式。如果您自己设计数据库,那么使用复合主键应该有很好的理由。如果唯一的原因是确保每个
专业化都有一个现有的
专业化
,那么就有更简单、更标准的方法来实现。执行此操作的标准方法是将
Specialization\u id
设置为
Specialization
表中的外键,并将
Specialization\u id
设置为
Socialization
表中的主键。此代码向我提供了一个错误:条件表达式中的数据类型不匹配。我有专业名称作为短文本,专业id作为编号,专业id作为编号。总的来说,我没有得到这个查询,值(…)在哪里?而且我的查询不适用于O