Delphi-PRAXiS

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

hoika 22. Feb 2023 13:50

AW: PrimärIndex wird nicht angelegt
 
Hallo,
hilft das hier?
Gerade der untere Bereich mit dem zusätzlichen CreateTable-Parametern.

https://stackoverflow.com/questions/...out-sql-script

himitsu 22. Feb 2023 13:57

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

Uwe Raabe 22. Feb 2023 14:50

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;

Reinhold 23. Feb 2023 14:18

AW: PrimärIndex wird nicht angelegt
 
Hallo Klaus,

dein Code:
Code:
   table.AddIndex('pkRow1', 'row1', '', [soPrimary]);
und hier der Code von Uwe (Post #7):
Code:
   table.AddIndex('pkRow1', 'row1', '', [ixPrimary]);
fällt dir da irgenwas auf.

Klaus01 24. Feb 2023 07:38

AW: PrimärIndex wird nicht angelegt
 
Zitat:

Zitat von Reinhold (Beitrag 1519024)
Hallo Klaus,

dein Code:
Code:
   table.AddIndex('pkRow1', 'row1', '', [soPrimary]);
und hier der Code von Uwe (Post #7):
Code:
   table.AddIndex('pkRow1', 'row1', '', [ixPrimary]);
fällt dir da irgenwas auf.

da zitierst Du falsch.

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