Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi PrimärIndex wird nicht angelegt (https://www.delphipraxis.net/212521-primaerindex-wird-nicht-angelegt.html)

Klaus01 22. Feb 2023 09:04

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:
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
Jemand ein Idee, was ich übersehen haben könnte?

Grüße
Klaus

Uwe Raabe 22. Feb 2023 09:44

AW: PrimärIndex wird nicht angelegt
 
Muss eine Column für den Primary key nicht Required sein?

himitsu 22. Feb 2023 09:59

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.

Klaus01 22. Feb 2023 10:06

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;

Uwe Raabe 22. Feb 2023 10:30

AW: PrimärIndex wird nicht angelegt
 
Anstatt mit AddIndex versuch es doch mal mit IndexDefs.Add.

Klaus01 22. Feb 2023 11:20

AW: PrimärIndex wird nicht angelegt
 
...leider tut es das auch nicht
Delphi-Quellcode:
table.IndexDefs.Add('pkRow1', 'row1', [ixPrimary, ixUnique]);
.. vielleicht sollte ich auf DDL umsteigen und das Script dann einlesen.

Uwe Raabe 22. Feb 2023 12:59

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:
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;
Ein Aufruf sieht dann in etwa so aus:
Delphi-Quellcode:
  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);
Ich habe aber leider auch keine Idee, warum es bei dir nicht klappt.

Klaus01 22. Feb 2023 13:26

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

Uwe Raabe 22. Feb 2023 13:39

AW: PrimärIndex wird nicht angelegt
 
Du kannst bei einem AutoInc-Field ja für den Import das Property IdentityInsert auf True setzen.

Klaus01 22. Feb 2023 13:40

AW: PrimärIndex wird nicht angelegt
 
danke - gut zu wissen


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr.
Seite 1 von 2  1 2      

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