Teradata - Anfängerfrage

MatthiasG.

Benutzer
Beiträge
6
Hallo Zusammen,

um Teradata SQL zu lernen habe ich mir ein Buch (siehe link unter Materialien) vorgenommen und zuerst einmal eine Übungsdatenbank erstellt.
Einstieg in SQL

Allerdings funktionieren einige Statements nicht in Teradata -> ich glaube CASCADE gibt es nicht in Teradata.

Ich hoffe, jemand hat Zeit und Lust mir zu antworten - würde mich freuen...

/* Lege Tabelle wohnort_c an */
CREATE TABLE Uebungsdatenbank.wohnort_c(
idadresse INTEGER NOT NULL PRIMARY KEY,
strasse VARCHAR(120),
hausnummer VARCHAR(120),
plz integer,
ort VARCHAR(120),
auszubildenderid INTEGER,
CONSTRAINT auszubildenderid_FK2
FOREIGN KEY (auszubildenderid)
REFERENCES auszubildender_c(id) ON UPDATE CASCADE
);


Ergebnis bzw. Fehlermeldung:
CREATE TABLE Failed. 3707: Syntax error, expected something like ')' between ')' and the 'ON' keyword.
---

hier noch ein zweites Statement:

/*Lege Tabelle kreditinstitutneu an*/
create table Uebungsdatenbank.kreditinstitutneu(
id serial not null primary key auto_increment,
bankid integer,
bankleitzahl integer,
bezeichnung varchar(120),
plz integer,
ort varchar(120)
);

Ergebnis bzw. Fehlermeldung:
CREATE TABLE Failed. 3706: Syntax error: Data Type "serial" does not match a Defined Type name.
 
Werbung:
Ja, auch für eine Bankleitzahl würde ich kein INTEGER verwenden, selber Grund wie bei PLZ.

Gemäß der Doku von Teradata:

Code:
Teradata Database does not support the following ANSI/ISO SQL:2011 referential action options for FOREIGN KEY … REFERENCES constraints:
[LIST]
[*]MATCH {FULL | PARTIAL | SIMPLE}
[*]ON UPDATE {CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION}
[*]ON DELETE {CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION}
[/LIST]

Und auch SERIAL scheint es nicht zu können. Deine verwendete Syntax sieht sehr nach PostgreSQL aus, allerdings wäre das auto_increment falsch.
 
Hallo,

danke für die schnellen Antworten.

Die auf Teradata Online Documentation hatte ich auch gefunden - gestaltet sich aber als sehr mühselig... (zumindest als Beginner).

Als Ersatz für SERIAL habe ich eine Lösung gefunden - wie CASCADE ersetzt werken kann weiß ich nicht :(

/*Lege Tabelle kreditinstitutneu an*/
create table Uebungsdatenbank.kreditinstitutneu(

id INTEGER GENERATED ALWAYS AS IDENTITY
(START WITH 1
INCREMENT BY 1
MINVALUE 0
MAXVALUE 1000000
NO CYCLE),

bankid integer,
bankleitzahl integer,
bezeichnung varchar(120),
plz integer,
ort varchar(120)
);
 
wenn die DB das CASCADE nicht kann wird es schwer, das nachzubilden. Die Datentypen sind noch immer faktisch falsch. Warum Teradata, ist das eine 'harte' Bedingung? Wenn es Dir darum geht, SQL zu lernen, würde ich Dir PostgreSQL empfehlen.
 
Hallo Zusammen,
-- ON UPDATE CASCADE habe ich für die Erstellung erstmal weggelassen.

Danke für die Tipps. Das Datenformat für Bankleitzahl, PLZ etc. habe ich direkt aus dem Buch...

Ein Statement hätte ich noch:



/* Lege Tabelle umsatz2 an */

create table Uebungsdatenbank.umsatz2(

jahr integer,

quartal integer,

monat integer,

umsatz numeric(12,2),

constraint pk_umsatz primary key (jahr,quartal,monat)

);


Fehlermeldung:
Statement 1: CREATE TABLE Failed. 3707: Syntax error, expected something like ',' between the 'key' keyword and '('.
 
Deine Syntax scheint für Teradata schlicht falsch zu sein. Laut Doku kann man keinen Inline Constraint angeben, nur eine PK Definition.
Warum setzt man sowas ein? Ist es besonders schnell? Scheint jedenfalls nicht sehr viele Möglichkeiten zu bieten. Terabyte an Daten kann man heute auch anders verwalten.
 
im übrigen ist sowas fast immer auch schlicht und ergreifend schlechtes Design:

Code:
create table Uebungsdatenbank.umsatz2(
jahr integer,
quartal integer,
monat integer,
...

offenbar zerteilst Du ein bekanntest Datum in bestimmte Einheiten - warum? Kommt das auch aus dem Buch?
 
Werbung:
offenbar zerteilst Du ein bekanntest Datum in bestimmte Einheiten - warum? Kommt das auch aus dem Buch?

Wenn es wirklich nur die Werte für Jahr, Monat und Quartal gibt, dann finde ich das Aufteilen in drei Spalten nicht wirklich schlimm. Ein DATE wäre dafür nicht geeignet - die Variante stattdessen ein Datum am ersten des Monats zu speichern finde ich persönlich auch nicht schöner.

Über das Quartal könnte man streiten, da man dass ja auch den Werten von Jahr und Monat ableiten könnte.
 
Zurück
Oben