2013-04-11 75 views
1

这是我第一次使用oracle SQL,并且在创建具有唯一键的表时遇到问题。Oracle - 如何创建一个具有自动增量唯一键ID的表格

我不明白为什么这个自动递增的ID是不工作:

ID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY 

下一个问题我已经是为什么我在我的每个语句得到一个错误:

ORA-00922: missing or invalid option 

这里是我的代码:

-- 
-- Sequence for aout incrment 
-- 
CREATE SEQUENCE IF NOT EXISTS AUTO_INC_SEQ 
START WITH 1 
INCREMENT BY 1; 

-- 
-- Table Person 
-- 
CREATE TABLE IF NOT EXISTS FITNESS_PERSON 
(
ID NUMBER NOT NULL PRIMARY KEY, 
FIRST_NAME VARCHAR NOT NULL, 
LAST_NAME VARCHAR NOT NULL, 
NICK_NAME VARCHAR NOT NULL, 
DATE_BIRTH DATE NOT NULL, 
PASSWORD VARCHAR NOT NULL, 
CONSTRAINT UNIQUE(NICK_NAME) 
); 

-- 
-- Table BMR 
-- 
CREATE TABLE IF NOT EXISTS FITNESS_BMR 
(
ID NUMBER NOT NULL PRIMARY KEY, 
VALUE FLOAT NOT NULL, 
VALUE_DATE DATE NOT NULL 
); 

-- 
-- M:N for BMR and Person 
-- 
CREATE TABLE IF NOT EXISTS FITNESS_BMR_PERSON 
(
BMR_ID NUMBER NOT NULL, 
PERSON_ID NUMBER NOT NULL, 
FOREIGN KEY(BMR_ID) REFERENCES FITNESS_BMR(ID), 
FOREIGN KEY(PERSON_ID) REFERENCES FITNESS_PERSON(ID), 
CONSTRAINT BMR_PER PRIMARY KEY(BMR_ID, PERSON_ID) 
); 

什么是做到这一点的正确方法(创建一个表并与AUT递增密钥是唯一的)。

+0

Oracle不支持'IF NOT EXISTS'用于'CREATE TABLE'或“CREATE SEQUENCE”。它也没有'AUTO_INCREMENT'列。删除这些,你会得到更多。至于'IF NOT EXISTS',只需在每个CREATE TABLE之前放一个'DROP TABLE whatever' - 如果该表尚不存在,你将会得到一个错误,但它是无害的。 – 2013-04-11 19:16:51

+1

如果该表确实存在,并且其中的数据被删除,则很难将其描述为无害。 – 2013-04-11 19:19:36

+0

好的thx。这帮助了很多^^ 我该如何解决我的自动增量问题。因为我希望我的ID通过插入新数据自动增加。 – user1882812 2013-04-11 19:24:49

回答

3

您可以使用表格,序列来生成唯一的ID值和触发器。

例如:

表:

CREATE Table FITNESS_BMR 
(
ID NUMBER NOT NULL PRIMARY KEY, 
VALUE FLOAT NOT NULL, 
VALUE_DATE DATE NOT NULL 
); 

序列:create sequence t1_seq start with 1 increment by 1 nomaxvalue;

触发:

CREATE OR REPLACE TRIGGER test_trigger 
BEFORE INSERT 
ON FITNESS_BMR 
REFERENCING NEW AS NEW 
FOR EACH ROW 
BEGIN 
SELECT t1_seq.nextval INTO :NEW.ID FROM dual; 
END; 
/ 
+0

我在10年内没有使用Oracle,因此您可能需要微调语法。哦,只是看到了接受。 :) – 2013-04-11 19:36:45

+0

确定还是有问题^^ 我的SQL脚本在触发器创建后立即停止。 为什么?因为END? 我不得不使用自动递增的ID来创建更多的表格,而不是我上面列出的。 (总共321个,我必须为每个表定义一个触发器,但它在第一次触发后停止) – user1882812 2013-04-11 20:44:37

+0

和theres再次的东西-.- ORA-00907:缺少右括号 我打开并正确关闭所有内容。 - – user1882812 2013-04-11 20:48:55

相关问题