Как проверить ограничение в оракуле - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть следующее ограничение:

ALTER TABLE Movie
  ADD CONSTRAINT NomsRANGE
CHECK (totalNoms BETWEEN 0 AND 20);

... и использовал следующее, чтобы попробовать и проверить это:

INSERT INTO Movie
  (totalNoms)
VALUES
  ('23');

Я получаю следующую ошибку:

cannot insert NULL into ("ALI"."MOVIE"."MOVIEID")

Моя схема:

Actor (actorID, lastName, firstName, middleName, suffix, gender, birthDate, deathDate)
Movie (movieID, title, year, company, totalNoms, awardsWon, DVDPrice, discountPrice)
Quote (quoteID, quote)
Role (roleID ,roleName ,gender ,actorID* ,movieID*) 
RoleQuote (roleID*, quoteID*)

А мои отношения:

CONSTRAINT_NAME                C                                                
------------------------------ -                                                
QUOTE_FK                       R                                                
ROLE_FK                        R                                                
MOVIE_ROLE_FK                  R                                                
ACTOR_ROLE_FK                  R                                                
ACTORID                        P                                                
MOVIEID                        P                                                
QUOTEID                        P                                                
ROLEID                         P                                                
ROLEQUOTEID                    P                                                

9 rows selected.

Answer:

Ответ был прост, никто из вас не заметил, что это заняло у меня целый день, но я решил, поэтому выкладываю решение, чтобы оно помогало другим.

INSERT INTO Movie (movieID, totalNoms) ЗНАЧЕНИЯ («049», «22»);

Я пропустил первое значение, которое было первичным ключом, поскольку ошибка говорила: cannot insert NULL into ("ALI"."MOVIE"."MOVIEID")

Когда я ввел новый первичный ключ, он показал, что ограничение было нарушено

Спасибо, ребята, за помощь

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Если вы опустите столбцы в операторе INSERT, базе данных все равно нужно будет заполнить столбец для этой строки. Это будет NULL, если вы не установите ограничение DEFAULT / etc для каждого столбца.

Ошибка говорит вам, что MOVIE.movieid не принимает NULL, что хорошо. Похоже, вам нужно настроить последовательность для заполнения значения или предоставить логику для того, как вы хотите MOVIE.movieid заполнить (гораздо менее идеальный). На последовательность можно ссылаться в операторе INSERT, чтобы заполнить значение, или вы можете посмотреть на триггеры / ограничения по умолчанию для обработки вещей в фоновом режиме.

Вам нужно будет выяснить, как вы хотите / должны обрабатывать любые другие ошибки, относящиеся к столбцу NULLability. Только после того, как это будет сделано, вы сможете увидеть, работает ли ваше ограничение CHECK - существует небольшая проблема, если значение будет предоставлено в виде строки, если Oracle неявно преобразует его в тип данных INT / NUMERIC.

3 голосов
/ 27 февраля 2012

1) Конкретная ошибка говорит вам, что в вашем операторе INSERT необходимо указать MovieID.Если вы создали последовательности для генерации значений синтетического первичного ключа, вам нужно что-то вроде этого (при условии, что в таблице Movie нет других столбцов NOT NULL)

INSERT INTO Movie
  (movieID, totalNoms)
VALUES
  (movieId_seq.nextval, 23);

2) Предполагая, что totalNoms - это NUMBER, так как ваше проверочное ограничение рассматривает его как число, вам нужно вставить число 23, а не строку 23.Заставлять Oracle делать неявные преобразования никогда не будет хорошей идеей - это, вероятно, не будет иметь значения для простого INSERT, как это, но если вы привыкли использовать числа, когда имеете дело с числовыми полями и строками, когда вы 'При работе с полями персонажей жизнь станет намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...