2017-03-29 2 views
0

이 주제에 대한 몇 가지 질문을 검색했지만 이러한 질문은 PK 등이없는 테이블을 만들 수 있는지 여부와 관련이 있다는 것을 깨달았습니다. 제 문제는 다음 코드는 오류를 생성하는 : E/SQLiteLog: (1) near "FOREIGN": syntax errorSqlite 외래 키를 사용하여 테이블을 만드는 방법

코드 :

CREATE TABLE tblPart(PartNumber [nvarchar](15) PRIMARY KEY NOT NULL, 
PartDescription [nvarchar](150) NOT NULL); 

CREATE TABLE tblStock(PartNumber [nvarchar](15) FOREIGN KEY REFERENCES 
tblPart(PartNumber) ON DELETE CASCADE ON UPDATE CASCADE NOT NULL, 
StockOH [int] NOT NULL); 

완벽 MSSQLSERVER 작품이 코드를 실행하지만, SQLite를 사용 Java/Android에서 실행할 때이 오류를 밝혔다 생성합니다.

도움을 주셔서 감사합니다.

편집 :

의 DataHandler 클래스 :

public myDAL(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 
{ 
    super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    //region create tblPart 
    sbCreatePart.append("CREATE TABLE " + TABLE_PART + "("); 
    sbCreatePart.append(COLUMN_PART_PARTNR + " [nvarchar](15) PRIMARY KEY NOT NULL, "); 
    sbCreatePart.append(COLUMN_PART_DESCRIPTION + " [nvarchar](150) NOT NULL)"); 
    //endregion 

    //region create tblCurrentStock 
    sbCreateCurrStock.append("CREATE TABLE " + TABLE_CURRENTSTOCK + "("); 
    sbCreateCurrStock.append(COLUMN_CURRENTSTOCK_PARTNR + " [nvarchar](15) FOREIGN KEY REFERENCES " 
     + TABLE_PART + "(" + COLUMN_PART_PARTNR + ") ON DELETE CASCADE ON UPDATE CASCADE NOT NULL, "); 
    sbCreateCurrStock.append(COLUMN_CURRENTSTOCK_STOCKOH + " [int] NOT NULL)"); 
    //endregion 
    db.execSQL(sbCreatePart.toString()); 
    Log.d("Test", "tblPart"); 
    db.execSQL(sbCreateCurrStock.toString()); 
    Log.d("Test", "tblCurrStock"); 
} 

public boolean TestInsert() 
{ 
    boolean result = true; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 

    try 
    { 
     values.put(COLUMN_PART_PARTNR, "PNTest123"); 
     values.put(COLUMN_PART_DESCRIPTION, "Dummy Test Part"); 
     Log.d("Test Input", "Values Added"); 
     db.insert(TABLE_PART, null, values); 
     Log.d("Test Input", "Insert Successful"); 
    } 
    catch (Exception ex) 
    { 
     result = false; 
    } 
    finally 
    { 
     db.close(); 
    } 
    return result; 
} 

활동 등급 :

public void onPartsClick(View v) 
{ 
    myDAL dal = new myDAL(this, null, null, 1); 
    boolean x = dal.TestInsert(); 
    if(x) 
     Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_SHORT).show(); 
} 
+0

? 그냥 데이터베이스에 테이블을 만드는거야? Android Studio 사용 –

+0

지금은 예. 이 코드를'DataHandler extends SQLiteOpenHelper'의 onCreate에 놓았습니다. 버튼을 클릭합니다. DataHandler의 인스턴스를 인스턴스화하고 더미 삽입 메소드를 호출하여 삽입 기능을 테스트하지만, 심지어 삽입에 도달하지 않으면 buttonClick 바로 다음에 오류가 발생합니다. (삽입 호출은 tblPart에 단일 레코드를 삽입하기 때문에 예외의 원인이되어서는 안됩니다.) – JDProwler

+0

여기에 전체 코드를 입력하십시오 –

답변

2

당신은이 구문 오류가 이것을 시도 :

CREATE TABLE tblPart(PartNumber nvarchar(15) PRIMARY KEY NOT NULL, 
PartDescription nvarchar(150) NOT NULL); 

CREATE TABLE tblStock(PartNumber nvarchar(15) REFERENCES 
tblPart(PartNumber) ON DELETE CASCADE ON UPDATE CASCADE NOT NULL, 
StockOH integer NOT NULL); 

을 당신은를 필요 없어요열 정의에 외래 키 정의를 추가하는 경우

또는은 다음과 같이 그것을 시도 : 당신은 무엇을하고

CREATE TABLE tblStock10(PartNumber nvarchar(15), 
StockOH integer NOT NULL, 
FOREIGN KEY (PartNumber) REFERENCES tblPart1(PartNumber) 
    ON UPDATE SET NULL); 
+0

고마워. 참으로 문제였습니다. 재미있게도 정확한 코드는 MSSQLSERVER에서 작동하지만 SQLite에서는 작동하지 않습니다. 하지만 어쨌든 덕분에 @Degen Sharew – JDProwler

+0

NP. 우리가 stackoverflow에서 무엇을하는지; 우리는 서로 돕는다. :) – dsharew

관련 문제