2017-02-23 83 views
2
create sequence student_studentid_seq 
increment by 10 
start with 100 
nocycle; 

create table student 
(studentid number(10), 
name varchar2(30) not null, 
ss# number(9) unique, 
gpa number(2,3) not null, 
    constraint student_studentid_pk PRIMARY KEY (studentid), 
    constraint student_gpa_ck CHECK (GPA >= 0)); 

insert into student (studentid, name, ss#, gpa) 
       values(student_studentid_seq.NEXTVAL,'Draze Katan', 323456789,1); 

receiving error message: 
Error starting at line 29 in command: 
insert into student (studentid, name, ss#, gpa) 
       values(student_studentid_seq.NEXTVAL,'Draze Katan', 323456789,1) 
Error report: 
SQL Error: ORA-01438: value larger than specified precision allowed for this column 
01438. 00000 - "value larger than specified precision allowed for this column" 
*Cause: When inserting or updating records, a numeric value was entered 
      that exceeded the precision defined for the column. 
*Action: Enter a value that complies with the numeric column's precision, 
      or use the MODIFY option with the ALTER TABLE command to expand 
      the precision. 

因此,看來錯誤消息是針對下一個約束:約束student_gpa_ck CHECK(GPA> = 0)); 在插入語句中,如果我爲GPA輸入'0',原始數據將被插入,但是更多我將收到錯誤消息。我創建了CHECK約束,但收到錯誤消息

這是我的一個練習題,我弄不明白。我只需要提示錯誤不是全分辨率。請如果你能幫助我。

+0

你爲什麼使用數字(10)作爲主鍵。它應該是整數。數字較慢。 –

+0

@JoeLove數字較慢?你能否用一些支持數據來說明這一點? – BobC

+1

爲什麼'數字(2,3)'爲GPA?這是問題(不是「檢查約束」)。你是什​​麼意思?如果你的意思是數字3.84和2.33,那麼你需要數字(3,2)'。 3表示「三位有效數字」,2表示「......其中最後兩位在小數點後」。 – mathguy

回答

5

問題出在您創建表的方式,特別是在GPA列中。

您正在使用number(2, 3),它看起來像「用2位總數和3位小數位構建一個數字」。

oracle documentation你找到關於NUMBER數據類型,其屬性和什麼東西像number(2,3)平均一個更好的解釋:

使用以下格式,指定定點編號:

號(P ,s)其中:

p是精度或最大有效小數數字 數字,其中最高有效數字是最左邊的非零數字 dig它,最不重要的數字是最右邊的已知數字。 Oracle保證數字的可移植性,精度最高爲 20個基數爲100位,相當於39或40個十進制數字 ,具體取決於小數點的位置。

s是比例或從小數點到 最低有效位數的位數。比例範圍可以從-84到127.

正數比例是 小數點右邊的有效位數(包括最低有效位數)的數目。

負標度是 小數點左邊的有效位數,但不包括最低有效位。對於 負比例,最小有效數字位於 小數點的左側,因爲實際數據四捨五入爲小數點左邊指定的 位數。例如,(10,-2)的 規範意味着四捨五入到數百。

比例可以大於精度,最常見的情況是使用e符號 。當比例大於精度時,精度指定 點的右邊的有效位數的最大數量爲 。例如,定義爲NUMBER(4,5)的列對於小數點後的第一個數字要求爲零 ,並將小數點後第五個數字的所有值捨棄爲 。

例如:

SQL> create table tabError(a number (2, 3)); 

Table created. 

SQL> insert into tabError values (1); 
insert into tabError values (1) 
          * 
ERROR at line 1: 
ORA-01438: value larger than specified precision allowed for this column 


SQL> insert into tabError values (0.1); 
insert into tabError values (0.1) 
          * 
ERROR at line 1: 
ORA-01438: value larger than specified precision allowed for this column 


SQL> insert into tabError values (0.01); 

1 row created. 

如果需要2個位數的整數部分和3位小數,你需要number(5, 3),或根據Mathguy的評論,如果你需要的數字與一個整數位和2小數點後,您需要number(3,2)

+1

Oracle不會拒絕創建這樣的非實例嗎?奇怪。 – dnoeth

+0

@dnoeth我添加了一個更新的鏈接,可以更好地解釋Oracle在這種情況下做了什麼 – Aleksej

+1

@dnoeth - 爲什麼這是「無稽之談」? 'NUMBER(2,3)'是數字從0.001到0.099的正確數據類型。它僅僅意味着小數點右邊的三位小數的「縮放」,以及只有兩位有效數字的「精度」。 OP不正確地使用(認爲它意味着不同的東西)並不會使其成爲「無稽之談」。 – mathguy