QUESTION 31 CREATE table 注意事项

本文分析了四个CREATE TABLE语句示例,指出每个语句的问题所在,并确定了正确的表格创建方式。强调了一个表只能有一个主键,UNIQUE与NOT NULL间不应有逗号,以及DEFAULT NOT NULL需要指定默认值等关键点。
32. Which CREATE TABLE statement is valid? 
A. CREATE TABLE ord_details         
(ord_no NUMBER(2) PRIMARY KEY,  
item_no NUMBER(3) PRIMARY KEY,  
ord_date DATE NOT NULL); 
B. CREATE TABLE ord_details         
(ord_no NUMBER(2) UNIQUE, NOT NULL,  
item_no NUMBER(3),  
ord_date DATE DEFAULT SYSDATE NOT NULL); 
C. CREATE TABLE ord_details         
(ord_no NUMBER(2) ,  
item_no NUMBER(3),  
ord_date DATE DEFAULT NOT NULL,  
CONSTRAINT ord_uq UNIQUE (ord_no),  
CONSTRAINT ord_pk PRIMARY KEY (ord_no)); 
D. CREATE TABLE ord_details  
(ord_no NUMBER(2),  
item_no NUMBER(3),  
ord_date DATE DEFAULT SYSDATE NOT NULL,  
CONSTRAINT ord_pk PRIMARY KEY (ord_no, item_no)); 


答案:D

解析:

--A选项错误,一个表不能有两个主键
SQL> CREATE TABLE ord_details
  2  (ord_no NUMBER(2) PRIMARY KEY,
  3  item_no NUMBER(3) PRIMARY KEY,
  4  ord_date DATE NOT NULL);
item_no NUMBER(3) PRIMARY KEY,
                  *
ERROR at line 3:
ORA-02260: table can have only one primary key

--B选项错误,UNIQUE和NOT NULL之间应该没有逗号。
SQL> CREATE TABLE ord_details
  2  (ord_no NUMBER(2) UNIQUE, NOT NULL,
  3  item_no NUMBER(3),
  4  ord_date DATE DEFAULT SYSDATE NOT NULL);
(ord_no NUMBER(2) UNIQUE, NOT NULL,
                          *
ERROR at line 2:
ORA-00904: : invalid identifier

--C选项错误,有两处,一个是在ord_date DATE DEFAULT NOT NULL未指定默认值,一个是创建主键约束的时候会创建一个唯一约束和一个主键约束,因此再次建立唯一约束会导致错误
SQL> CREATE TABLE ord_details
  2  (ord_no NUMBER(2) ,
  3  item_no NUMBER(3),
  4  ord_date DATE DEFAULT NOT NULL,
  5  CONSTRAINT ord_uq UNIQUE (ord_no),
  6  CONSTRAINT ord_pk PRIMARY KEY (ord_no));
ord_date DATE DEFAULT NOT NULL,
                      *
ERROR at line 4:
ORA-00936: missing expression
SQL>  CREATE TABLE ord_details
  2   (ord_no NUMBER(2) ,
  3   item_no NUMBER(3),
  4   ord_date DATE DEFAULT to_date(20140101,'yyyymmdd') NOT NULL,
  5   CONSTRAINT ord_uq UNIQUE (ord_no),
  6   CONSTRAINT ord_pk2 PRIMARY KEY (ord_no));
 CONSTRAINT ord_uq UNIQUE (ord_no),
                   *
ERROR at line 5:
ORA-02261: such unique or primary key already exists in the table

--D选项正确,顺利执行
SQL>  CREATE TABLE ord_details
  2  (ord_no NUMBER(2),
  3  item_no NUMBER(3),
  4  ord_date DATE DEFAULT SYSDATE NOT NULL,
  5  CONSTRAINT ord_pk1 PRIMARY KEY (ord_no, item_no));

Table created.



package com.example.myapplication; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import java.util.ArrayList; import java.util.List; public class QuestionDAO extends SQLiteOpenHelper { private static final String DATABASE_NAME = "question.db"; private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME = "questions"; private static final String COLUMN_ID = "id"; private static final String COLUMN_TYPE = "type"; private static final String COLUMN_TITLE = "title"; private static final String COLUMN_OPTION_A = "optionA"; private static final String COLUMN_OPTION_B = "optionB"; private static final String COLUMN_OPTION_C = "optionC"; private static final String COLUMN_OPTION_D = "optionD"; private static final String COLUMN_ANSWER = "answer"; private static final String COLUMN_EXPLANATION = "explanation"; public QuestionDAO(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String createTableQuery = "CREATE TABLE " + TABLE_NAME + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_TYPE + " TEXT, " + COLUMN_TITLE + " TEXT, " + COLUMN_OPTION_A + " TEXT, " + COLUMN_OPTION_B + " TEXT, " + COLUMN_OPTION_C + " TEXT, " + COLUMN_OPTION_D + " TEXT, " + COLUMN_ANSWER + " TEXT, " + COLUMN_EXPLANATION + " TEXT)"; try { db.execSQL(createTableQuery); Log.d("QuestionDAO", "Table created successfully"); } catch (Exception e) { Log.e("QuestionDAO", "Error creating table: " + e.getMessage()); } } @Override
05-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值