2017-03-29 15 views
0

このトピックに関するいくつかの質問を検索しましたが、これらの質問は、PKなどがないテーブルを作成することが許可されているかどうかに関連しています。 E/SQLiteLog: (1) near "FOREIGN": syntax errorSqlite外部キーを使用してテーブルを作成する方法

コード:完璧MSSQLSERVER作品にこのコードを実行する

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); 

が、それは誤りを言っ生成SQLiteを使用してJava/Androidで実行したときに、次のコードは、エラーが発生しています。

ありがとうございました。

EDIT:

た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'に入れ、ボタンをクリックしてDataHandlerのインスタンスをインスタンス化してダミーInsertメソッドを呼び出して挿入機能をテストしますが、挿入に達していない場合でも、buttonClickの直後にエラーが発生します。 (挿入呼び出しは、tblPartに1つのレコードを挿入するため、例外の原因ではないはずです) – 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); 

をカラム定義に外部キー定義を入れると、

ORはこのようにそれを試してください:あなたは何をしている

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

関連する問題