admin

Oracle中的变量操作

sql

因此,我整个下午一直在网上闲逛,以找到答案。我有一个看起来像这样的表:

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;

谁能启发我?


阅读 309

收藏
2021-07-01

共1个答案

admin

看来您想要做的是最初将每一行设置为具有不同的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中逐行同时读取和设置环境变量。

2021-07-01