因此,我整个下午一直在网上闲逛,以找到答案。我有一个看起来像这样的表:
CREATE TABLE ldap_domains ( domain varchar(128) NOT NULL, name varchar(16) NOT NULL, description varchar(32) NOT NULL ) ALTER TABLE ldap_domains ADD CONSTRAINT pk_domain PRIMARY KEY (domain); INSERT INTO ldap_domains VALUES ('test', 'test', 'test'); INSERT INTO ldap_domains VALUES ('test1', 'test', 'test'); INSERT INTO ldap_domains VALUES ('test2', 'test', 'test'); INSERT INTO ldap_domains VALUES ('test3', 'test', 'test');
我需要修改此表,以便新列成为主键。作为此过程的一部分,我需要在应用约束之前使用唯一值更新新列。看起来像这样:
ALTER TABLE ldap_domains DROP CONSTRAINT pk_domain; ALTER TABLE ldap_domains ADD id int; DECLARE @key int SET @key = 0 UPDATE ldap_domains SET @key = id = @key + 1; ALTER TABLE ldap_domains ALTER COLUMN id int NOT NULL; ALTER TABLE ldap_domains ADD CONSTRAINT pk_id PRIMARY KEY (id);
这在SQLServer上可以正常工作,但是,我也需要在Oracle上也可以使用。本质上,Oracle不喜欢的部分是:
DECLARE @key int SET @key = 0 UPDATE ldap_domains SET @key = id = @key + 1;
谁能启发我?
看来您想要做的是最初将每一行设置为具有不同的ID。在Oracle中执行此操作的首选方法是使用序列:
CREATE SEQUENCE seq_ldap_domains START WITH 0; UPDATE ldap_domains SET id = seq_ldap_domains.nextval;
如果相关的话,这不能保证插入的值是连续的(尽管在这种情况下,它们可能是连续的)。
由于您不太可能同时有其他进程来更新字段,因此,如果您确实不想创建序列,则作弊并使用如下所示的方法可能是安全的:
UPDATE ldap_domains SET id = rownum-1;
据我所知,您无法在Oracle中逐行同时读取和设置环境变量。