ОШИБКА в строке 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 с последующими вставками.

  1. Здесь нет text тип данных в оракуле.

  2. Здесь нет 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 вместо последовательности использования идентификаторов с предварительно вставленным триггером для автоматического приращения к столбцу
Другие вопросы по тегам