2012-02-26 31 views
-1

測試約束我有以下限制:如何在Oracle

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) VALUES('049','22');

我錯過這是因爲錯誤的主鍵是說的第一個值: cannot insert NULL into ("ALI"."MOVIE"."MOVIEID")

當我進入了一個新的主鍵它顯示的限制被侵犯

謝謝你們所有幫助

+0

問題是..? 'Movieid'初始化爲'not null'的權利? – Ben 2012-02-26 21:37:14

+0

是的,這是正確的 – user1137472 2012-02-26 21:48:01

+0

@ user1137472 - 我不明白你的更新,OMG Ponies和Justin Cave都告訴你,你必須爲'movieid'提供一個值。如果它們是「數字」列,則您也不需要引用值。 – 2012-02-28 08:04:21

回答

3

1)具體的錯誤是告訴你,你的INSERT聲明需要指定MovieID。如果您已經創建序列來生成合成主鍵值,你會想是這樣的(假設有在Movie表中沒有其他NOT NULL列)

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

2)假設totalNomsNUMBER因爲您的檢查約束將其視爲數字,您需要插入數字23而不是字符串23。強制Oracle進行隱式轉換決不是一個好主意 - 在這樣的簡單INSERT上可能無所謂,但如果您在處理數字字段和字符串時處理習慣使用數字與性格領域,生活將變得更加容易。

+0

好的,但有一個問題是什麼_seq?我不明白這個概念? – user1137472 2012-02-26 21:44:26

+0

這不起作用它說序列不存在,當然它不存在我試圖測試約束不添加一個值。 – user1137472 2012-02-26 21:46:39

+0

@ user1137472 - 如果不插入新行(或者至少嘗試插入新行),則無法測試約束。你如何確定在插入上使用的下一個'MovieID'?大多數人會創建一個序列(我猜這個名字,也許你用了一個不同的名字)來產生值,並在每個「INSERT」中使用這個序列。 – 2012-02-26 21:49:09

4

如果您省略INSERT語句中的列,那麼數據庫仍然需要填充該行的列。這將是NULL,除非您爲每列設置了DEFAULT約束/ etc。

錯誤是告訴你,MOVIE.movieid不接受NULL,這是很好的。這聽起來像你需要設置序列來填充值,或提供邏輯,但是你想要填充(遠不太理想)。可以在INSERT語句中引用該序列以填充該值,也可以查看觸發器/默認約束來處理背景中的事物。

你必須弄清楚你是否想要/需要處理與列可NULLability相關的任何其他錯誤。只有在完成之後,你才能夠看到你的CHECK約束條件是否有效 - 如果Oracle提供的值將作爲字符串提供,如果Oracle將其隱式轉換爲INT/NUMERIC數據類型,那麼會有一點擔心。