ОШИБКА в строке 2: ORA-00907: отсутствует правая скобка
Я получаю эту ошибку, и мне нужна ваша помощь:
ОШИБКА в строке 2: ORA-00907: отсутствует правая скобка
CREATE TABLE users(
user_id int IDENTITY(1,1) PRIMARY KEY,
user_name varchar2(100) NOT NULL DEFAULT '',
user_password varchar2(100) NOT NULL DEFAULT '',
f_name varchar2(50) NOT NULL DEFAULT '',
l_name varchar2(50) NOT NULL DEFAULT '',
signature text NOT NULL DEFAULT '',
link varchar2(255) NOT NULL DEFAULT '',
category_id int NOT NULL DEFAULT 1
);
3 ответа
НЕ NULL ПО УМОЛЧАНИЮ
''
пустая строка, которая в Oracle считается NULL. Таким образом, нет смысла иметь ограничение NOT NULL, но снова установить значение по умолчанию в NULL. Это противоречит!
Есть несколько проблем с вашей таблицей DDL. Создайте таблицу следующим образом:
SQL> CREATE TABLE users(
2 user_id NUMBER PRIMARY KEY,
3 user_name VARCHAR2(100) DEFAULT 'default' NOT NULL,
4 user_password VARCHAR2(100) DEFAULT 'default' NOT NULL,
5 f_name VARCHAR2(50) DEFAULT 'default' NOT NULL,
6 l_name VARCHAR2(50) DEFAULT 'default' NOT NULL,
7 signature VARCHAR2(255) DEFAULT 'default' NOT NULL,
8 LINK VARCHAR2(255) DEFAULT 'default' NOT NULL,
9 category_id NUMBER DEFAULT 1 NOT NULL
10 );
Table created.
SQL>
Примечание о столбце идентичности. Поскольку вы используете версию 10g, столбец идентификаторов не поддерживается. Он был введен в 12в.
Итак, вам нужно явно использовать последовательности. Вы можете использовать старый подход последовательности триггеров в вашем приложении для заполнения первичного ключа. Взгляните на демонстрацию для примера и использования здесь http://lalitkumarb.wordpress.com/2015/01/20/auto-increment-primary-key-in-pre-12c-releases-identity-functionality/
Например,
ТАБЛИЦА
SQL> CREATE TABLE t (
2 ID NUMBER(10) NOT NULL,
3 text VARCHAR2(50) NOT NULL);
Table created.
SQL>
ПЕРВИЧНЫЙ КЛЮЧ для заполнения последовательностью
SQL> ALTER TABLE t ADD (
2 CONSTRAINT id_pk PRIMARY KEY (ID));
Table altered.
SQL>
ПОСЛЕДОВАТЕЛЬНОСТЬ для поддержки первичного ключа
SQL> CREATE SEQUENCE t_seq
2 START WITH 1000
3 INCREMENT BY 1;
Sequence created.
SQL>
СПУСКОВОЙ КРЮЧОК
Если вы не хотите иметь последовательность в INSERT, вы можете автоматизировать ее с помощью TRIGGER.
SQL> CREATE OR REPLACE TRIGGER t_trg
2 BEFORE INSERT ON t
3 FOR EACH ROW
4 WHEN (new.id IS NULL)
5 BEGIN
6 SELECT t_seq.NEXTVAL
7 INTO :new.id
8 FROM dual;
9 END;
10 /
Trigger created.
SQL>
ВСТАВИТЬ
SQL> INSERT INTO t(text) VALUES('auto-increment test 1');
1 row created.
SQL> INSERT INTO t(text) VALUES('auto-increment test 2');
1 row created.
SQL>
Давайте посмотрим, есть ли у нас столбец идентификатора, автоматически увеличенный с желаемыми значениями
SQL> SELECT * FROM t;
ID TEXT
----- --------------------------------------------------
1000 auto-increment test 1
1001 auto-increment test 2
SQL>
Таким образом, столбец ID теперь начинается со значения 1000 и увеличивается на 1 с последующими вставками.
Здесь нет
text
тип данных в оракуле.Здесь нет
IDENTITY
модификатор в ORACLE до Oracle 12c. Если вы используете Oracle 12c, используйте этоCREATE TABLE users( user_id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY, user_name varchar2(100) NULL DEFAULT '', user_password varchar2(100) NULL DEFAULT '', f_name varchar2(50) NULL DEFAULT '', l_name varchar2(50) NULL DEFAULT '', signature clob NULL DEFAULT '', link varchar2(255) NULL DEFAULT '', category_id int NULL DEFAULT 1 );
Подробнее: Oracle IDENTITY
Я думал, что вы пытаетесь выполнить скрипт SQL в оракуле
CREATE TABLE users(
user_id int IDENTITY(1,1) PRIMARY KEY,
user_name varchar2(100) NOT NULL DEFAULT '',
user_password varchar2(100) NOT NULL DEFAULT '',
f_name varchar2(50) NOT NULL DEFAULT '',
l_name varchar2(50) NOT NULL DEFAULT '',
signature text NOT NULL DEFAULT '',
link varchar2(255) NOT NULL DEFAULT '',
category_id int NOT NULL DEFAULT 1
);
но мы должны были преобразовать, прежде чем выполнить в оракуле изменения включают в себя следующее
- заменить int на число (38) или число
- текст с символом char(50) или varchar2(50)
- лучше добавить первичный ключ в оператор alter
- вы используете не нуль, и вы пытаетесь вставить пустую строку в таблицу, на мой взгляд, это должно быть изменено с некоторым соответствующим значением
- не будет такого идентификатора типа (1,1) до оракула 11g, но он реализован в Oracle 12 вместо последовательности использования идентификаторов с предварительно вставленным триггером для автоматического приращения к столбцу