![]() |
Datenbank: sqLite • Version: 3.29.0 • Zugriff über: Firedac
PrimärIndex wird nicht angelegt
Liste der Anhänge anzeigen (Anzahl: 1)
.. wenn ich mit folgendem Code eine Tabelle erstelle,
wird das Feld "row1" angelegt. Mit addIndex sollte eigentlich auch ein Primarykey angelegt werden - was aber nicht passiert.
Delphi-Quellcode:
Jemand ein Idee, was ich übersehen haben könnte?
procedure TForm1.createTable;
var table: TFDTable; begin table := TFDTable.Create(nil); try table.Connection := fDbConnection; table.TableName := 'tab1'; table.FieldDefs.add('row1', ftInteger, 0, false); table.AddIndex('pkRow1', 'row1', '', [soPrimary]); table.CreateTable(false); finally table.Free; end; end Grüße Klaus |
AW: PrimärIndex wird nicht angelegt
Muss eine Column für den Primary key nicht Required sein?
|
AW: PrimärIndex wird nicht angelegt
@Uwe: Required ist es ja, siehe NOT NULL.
Enthält ein PK nicht eh implizit einen Index und das Required (NOT NULL) ? Aber trotz des soPrimary ist ja Primary=0, wobei das NotNull=1 schonmal stimmt. |
AW: PrimärIndex wird nicht angelegt
Hallo Uwe,
danke - auch dann wird leider kein PrimaryKey angelegt.
Delphi-Quellcode:
procedure TForm1.createTable;
var table: TFDTable; begin table := TFDTable.Create(nil); try table.Connection := fDbConnection; table.TableName := 'tab1'; table.FieldDefs.add('row1', ftInteger, 0, true); table.AddIndex('pkRow1', 'row1', '', [soPrimary]); table.CreateTable(false,[tpTable, tpPrimaryKey, tpGenerators, tpTriggers]); finally table.Free; end; end; |
AW: PrimärIndex wird nicht angelegt
Anstatt mit AddIndex versuch es doch mal mit IndexDefs.Add.
|
AW: PrimärIndex wird nicht angelegt
...leider tut es das auch nicht
Delphi-Quellcode:
.. vielleicht sollte ich auf DDL umsteigen und das Script dann einlesen.
table.IndexDefs.Add('pkRow1', 'row1', [ixPrimary, ixUnique]);
|
AW: PrimärIndex wird nicht angelegt
Ich benutze z.B. folgende Methode zum Anlegen von Tables in Delphi mit SQLite. Der Primary Key wird dabei für alle Tables identisch angelegt.
Delphi-Quellcode:
Ein Aufruf sieht dann in etwa so aus:
procedure TdmCreateDB.InternalCreateDataSet(const AName: string; AddFields: TProc<TFieldDefs>; AddIndices: TProc<TAddIndicesProc>);
var tbl: TFDTable; begin tbl := TFDTable.Create(nil); try tbl.Connection := Connection; tbl.TableName := AName; tbl.UpdateOptions.GeneratorName := 'GEN_' + AName.ToUpperInvariant; tbl.FieldDefs.Add('ID', ftAutoInc); AddFields(tbl.FieldDefs); tbl.IndexDefs.Add('PK_' + AName.ToUpperInvariant, 'ID', [ixPrimary]); if Assigned(AddIndices) then begin AddIndices( procedure(AName, AFields: string; AOptions: TIndexOptions) begin tbl.IndexDefs.Add('IX_' + tbl.TableName + '_' + AName, AFields, AOptions); end); end; tbl.CreateTable(tbl.Exists); finally tbl.Free; end; end;
Delphi-Quellcode:
Ich habe aber leider auch keine Idee, warum es bei dir nicht klappt.
InternalCreateDataSet('ZUGHH',
procedure(FieldDefs: TFieldDefs) begin FieldDefs.Add('TANK', ftSmallInt, 0, False); FieldDefs.Add('SORTE', ftString, 4, False); FieldDefs.Add('SERIE', ftFloat, 0, False); FieldDefs.Add('INHALT', ftSmallInt, 0, False); FieldDefs.Add('BEMERKUNG', ftString, 12, False); FieldDefs.Add('DATUM', ftDate, 0, False); end, procedure(AddIndex: TAddIndicesProc) begin AddIndex('I_SERIE', 'SERIE', []); end); |
AW: PrimärIndex wird nicht angelegt
Hallo Uwe,
danke - wenn das Feld auf den der primary key gelegt werden soll vom typ ftAutoInc ist, dann wird auch der primary key angelegt. Kann ich aber so dann nicht gebrauchen, da in die Tabelle Daten importiert werden müssen. In den Daten ist das Feld (auf dem der primary key liegt) auch vorhanden. Ich kann dann (leider) kein ftAutoInc verwenden. Den Key kann ich dann vielleicht nach dem Datenimport setzen. Grüße Klaus |
AW: PrimärIndex wird nicht angelegt
Du kannst bei einem AutoInc-Field ja für den Import das Property IdentityInsert auf True setzen.
|
AW: PrimärIndex wird nicht angelegt
danke - gut zu wissen
|
AW: PrimärIndex wird nicht angelegt
Hallo,
hilft das hier? Gerade der untere Bereich mit dem zusätzlichen CreateTable-Parametern. ![]() |
AW: PrimärIndex wird nicht angelegt
Wenn im Import für das AutoInc-Feld Daten vorhanden sind, dann werden Diese doch benutzt?
Das AutoInc sollte doch nur greifen, wenn man diesem Feld nichts zuweist, auch kein NULL (aber egal, da ja NOT NULL). |
AW: PrimärIndex wird nicht angelegt
Nein, denn ein AutoInc-Feld ist in der Regel vom Update ausgeschlossen und ReadOnly.
Zu diesem Zweck gibt es bei dem FireDAC-eigenen TFDAutoIncField eben das Property IdentityInsert. Dahinter steckt auch nichts Außergewöhnliches, was man nicht auch selbst machen könnte:
Delphi-Quellcode:
procedure TFDAutoIncField.SetIdentityInsert(const AValue: Boolean);
begin if AValue then begin ReadOnly := False; ProviderFlags := ProviderFlags + [pfInUpdate]; end else begin ReadOnly := True; ProviderFlags := ProviderFlags - [pfInUpdate]; end; end; |
AW: PrimärIndex wird nicht angelegt
Hallo Klaus,
dein Code:
Code:
und hier der Code von Uwe (Post #7):
table.AddIndex('pkRow1', 'row1', '', [soPrimary]);
Code:
fällt dir da irgenwas auf.
table.AddIndex('pkRow1', 'row1', '', [ixPrimary]);
|
AW: PrimärIndex wird nicht angelegt
Zitat:
bei Uwe ist es so:
Code:
table.IndexDefs.Add('pkRow1', 'row1', [ixPrimary]);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz