SQL(access)-向复合主键添加新字段

SQL(access)-向复合主键添加新字段,sql,ms-access,database-design,Sql,Ms Access,Database Design,我有一个名为table1的表,它有一个使用“ScreenId”和“ActivityItemId”的复合主键。我添加了一个新字段“ProductId”,该字段具有NOTNULL约束。我想将ProductId添加到复合主键 我想这会管用的 db.execute“ALTER TABLE table1主键(ScreenId、ActivityItemId、ProductId)” 但是我得到一个错误,我认为这种语法只在创建表时有效 有人能帮我解决SQL问题吗?(顺便说一句,我不能在这里使用visual ba

我有一个名为table1的表,它有一个使用“ScreenId”和“ActivityItemId”的复合主键。我添加了一个新字段“ProductId”,该字段具有NOTNULL约束。我想将ProductId添加到复合主键

我想这会管用的

db.execute“ALTER TABLE table1主键(ScreenId、ActivityItemId、ProductId)”

但是我得到一个错误,我认为这种语法只在创建表时有效

有人能帮我解决SQL问题吗?(顺便说一句,我不能在这里使用visual basic解决方案,我实际上是在使用ruby接口来运行sql,所以它只需要在sql中运行)

谢谢
max

尝试删除当前主键,然后创建新主键:

ALTER TABLE table1 DROP CONSTRAINT pk_名称


ALTER TABLE table1添加约束主键名称主键(ScreenId、ActivityItemId、ProductId)

尝试删除当前主键,然后创建新主键:

ALTER TABLE table1 DROP CONSTRAINT pk_名称


ALTER TABLE table1 ADD CONSTRAINT pk_name主键(ScreenId、ActivityItemId、ProductId)

考虑使用代理键而不是复合键。您不希望每次业务逻辑更改时都必须更改模式


保留这些关系作为唯一约束并添加代理键可能是值得的。

考虑使用代理键而不是复合键。您不希望每次业务逻辑更改时都必须更改模式



将这些关系保留为唯一约束并添加代理键可能是值得的。

您是否尝试使用设计视图而不是SQL来更改主键?

您是否尝试使用设计视图而不是SQL来更改主键?

+1:“复合主键”的更改实际上不是主键。它变了,所以它不是“行的唯一标识符。将复合键设为普通索引并添加唯一的代理键。谢谢Duffymo。这不是我的业务逻辑,我们不会在业务中使用access:)这实际上只是一项一次性工作。
虽然我不反对使用代理密钥来解决问题,但我以前从未听说过这个术语。我会查的。很好,Max。如果你使用Access,添加一个名为id的列,类型是AutoNumber,你就没事了。对其他列使用唯一的约束。-1“您不希望每次业务逻辑更改时都必须更改模式”--您可能不想更改,但当业务逻辑更改时,更改模式是不可避免的。此外,自然密钥与代理密钥是一个宗教问题。我见过一些数据库使用社会安全号码作为用户的主密钥,因为当隐私法使其难以获取时,必须对其进行争夺是“自然”的。没有什么宗教色彩。+1:“复合主键”的变化实际上不是主键。它变了,所以它不是“行的唯一标识符。将复合键设为普通索引并添加唯一的代理键。谢谢Duffymo。这不是我的业务逻辑,我们不会在业务中使用access:)这实际上只是一项一次性工作。
虽然我不反对使用代理密钥来解决问题,但我以前从未听说过这个术语。我会查的。很好,Max。如果你使用Access,添加一个名为id的列,类型是AutoNumber,你就没事了。对其他列使用唯一的约束。-1“您不希望每次业务逻辑更改时都必须更改模式”--您可能不想更改,但当业务逻辑更改时,更改模式是不可避免的。此外,自然密钥与代理密钥是一个宗教问题。我见过一些数据库使用社会安全号码作为用户的主密钥,因为当隐私法使其难以获取时,必须对其进行争夺是“自然”的。这一点都不重要。谢谢Hawx-但我得到了这个错误OLE错误代码:80004005在Microsoft JET数据库引擎检查约束“主键”不存在。我正在运行这个-也许这不是正确的语法?“ALTER TABLE table1 DROP CONSTRAINT[PrimaryKey]”而不是[PrimaryKey]使用您的主键名称。啊,我看到,方括号中的“在此处插入变量”。\n恐怕还是不走运-我正在执行此操作:ALTER TABLE Activity DROP CONSTRAINT ScreenId,我返回此错误检查约束“ScreenId”不存在。ScreenId肯定是这个表中的主键字段之一。这是一个access DB-access是否需要不同的语法?非常感谢-这是axactly Access语法,摘自Access联机帮助。问题是,主键约束的名称是错误的。另外,请尝试这个“ALTER TABLE Activity DROP CONSTRAINT PrimaryKey”;我希望,它会在不知道主键名称的情况下删除主键。已成功删除主键-实际的复合键名称是“Key1”,我必须传递到“DROP CONSTRAINT”子句。添加新的主键位第一次起作用。非常感谢你们的帮助!Maxx-但是我得到了这个错误OLE错误代码:80004005在Microsoft JET数据库引擎检查约束“主键”不存在。我正在运行这个-也许这不是正确的语法?“ALTER TABLE table1 DROP CONSTRAINT[PrimaryKey]”而不是[PrimaryKey]使用您的主键名称。啊,我看到,方括号中的“在此处插入变量”。\n恐怕还是不走运-我正在执行此操作:ALTER TABLE Activity DROP CONSTRAINT ScreenId,我返回此错误检查约束“ScreenId”不存在。ScreenId肯定是这个表中的主键字段之一。这是一个access DB-access是否需要不同的语法?非常感谢-这是axactly Access语法,摘自Access联机帮助。问题是,主键约束的名称是错误的。还有,试试看