Relationale Datenbanken
Allgemeine Infos
MySQL
Oracle
SQL Server 2000
Allgemeine Infos
Primary Keys
Primary Keys dienen der Erhaltung der Datenintegrität. Der Primary Key einer Tabelle
ist für jeden Datensatz der Tabelle einmalig.
Foreign Keys
Foreign Keys dienen der Erhaltung der Datenintegrität.
Datensätze einer Tabelle T1 können mit Datensätzen einer Tabelle T2 eindeutig über den
Primärschlüssel von T2 verbunden werden. Wird diese Verbindung (der Schlüssel) als
Foreign Key definiert, dann wacht die Datenbank nach verschiedenen Mustern über die Gültigkeit.
Datansätze aus T2 auf die ein Foreign Key verweist dürfen nicht gelöscht werden. Zuerst muss
der Datensatz aus T1 gelöscht werden oder der Foreign Key umgesetzt werden.
Dadurch ist sichergestellt, daß keine Referencen in der Datenbank existieren, die ins
Leere zeigen. Nicht alle Datenbanksystem unterstützen Foreign Key Constraints.
Index
Ein Index dient zur Beschleunigung des Zugriffs auf die Daten einer Tabelle.
Wenn kein Index existiert und ein Zugriff auf die Tabelle nicht über den
Primärschlüssel erfolgt, so müssen alle Datensätze der Tabelle mit dem
Zugriffkriterium verglichen werden, bis ein Match erfolgt.
SQL Beispiele
Beispiele
Tabelle anlegen
CREATE TABLE Address
(Id_Address int NOT NULL ,Street VARCHAR(50) NULL ,ZIP int NULL);
Primärschlüssel anlegen
ALTER TABLE Address ADD CONSTRAINT Address PRIMARY KEY (Id_Address);
Spaltennamen ändern von number nach nr (mysql)
ALTER TABLE Address CHANGE number nr int(4);
INSERT INTO Address VALUES(1,"Kasperweg",80000);
UPDATE Address SET Street = 'Kasperweg';
CREATE VIEW Customers, 10 AS fum AS SELECT * FROM Address;
Schema der Tabelle dirk ausgeben
DESC dirk;
Namen aller Tabellen ausgeben (Oracle)
SELECT table_name FROM user_tables;
MySQL
Passwort
Die Datenbank wird defaultmäßig mit dem User: "root" und einem leeren User erzeugt.
Beide haben kein Passwort und zwei Einträge in der Usertabelle, einen für
Lokalhost ("localhost") und einen für das Netz ("%"). Der leere User muss gelöscht werden.
mysql> UPDATE user SET password=PASSWORD('grummelfuk')
WHERE user='root';
Die Funktion Password sorgt für die Verschlüsselung.
Nach einer Passwortänderung am sichersten die Datenbank neu starten.
Files
Logdatei
Pfad: "C:\mysql\data\mysql.err"
Ini-File:
Pfad: "C:\WINNT\my.ini"
Inhalt:
[mysqld]
# set basedir to installation path, e.g., c:/mysql
basedir=D:/mysql/
# set datadir to location of data directory,
# e.g., c:/mysql/data or d:/mydata/data
datadir=D:/mysql/data
#innodb
innodb_data_home_dir = D:/Programme/mysql/data
#innodb_data_file_path = ibdata1:18M;ibdata2:100M:autoextend
innodb_data_file_path = ibdata1:10M:autoextend
#new log for innodb
innodb_log_group_home_dir = D:/Programme/mysql/data/innodb/dr3/iblogs
#.._log_arch_dir must be the same as .._log_group_home_dir
innodb_log_arch_dir = D:/Programme/mysql/data/innodb/dr3/iblogs
set-variable = innodb_log_files_in_group=3
#Set buffer pool size to 50 - 80 % of your computer's memory
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=10M
#Set the log file size to about 25 % of the buffer pool size
set-variable = innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=8M
#Set ..flush_log_at_trx_commit to 0
#if you can afford losing some last transactions
innodb_flush_log_at_trx_commit=1
Dienst
Dienst erzeugen und starten
Dienst von Commandozeile starten (geht erstaunlicher Weise auch ohne korrekte my.ini),
mysqld-max --standalone
mysqld-max ist in der Lage innodb (Transaktionen) zu verarbeiten,
Dienst installieren, als Windows-Dienst (geht nur mit korrekten Einträgen in der my.ini)
mysqld-max --install
Dienst stoppen
mysqladmin -u root -pgrummelfuk shutdown
oder über Dienste,
oder Admintool
Dienst löschen
mysqld --remove
Shell (mysql)
Login
mysql -u user -ppassword
Kein Leerzeichen zwischen -p und Passwort lassen.
User erstellen
GRANT ALL PRIVILEGES ON mydb.* TO Dirk@localhost
IDENTIFIED BY 'grummelfuk' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON mydb.* TO Dirk@"%"
IDENTIFIED BY 'grummelfuk' WITH GRANT OPTION;
Gibt alle Rechte an den User: "Dirk" mit dem Passwort "grummelfuk", für Lokalhost und Netz und für alle
Tabellen der Datenbank: "mydb".
Wenn der User noch nicht existiert, wird er angelegt. Danach Datenbank-Dienst stopen und wieder starten.
Datenbank erzeugen
CREATE DATABASE mydb;
Datenbank auswählen
USE mydb;
Index anzeigen
SHOW INDEX FROM mytable;
Sqlscripte aufrufen
SOURCE C:/script.sql;
Pfadangaben mit "/" an Stelle von "\".
Datenimport
mysql> LOAD DATA LOCAL INFILE "C:/data.txt" INTO TABLE
address FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY "\r\n";
Datenexport
mysql> SELECT * INTO OUTFILE "C:/data.txt" FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY "\r\n" FROM address;
Anzeige aller Datenbanken und Tabellen
SHOW DATABASES;
SHOW TABLES;
Transaktionen
Note that MySQL supports two different kinds of tables: transaction-safe tables (InnoDB and BDB)
and not transaction-safe tables (HEAP, ISAM, MERGE, and MyISAM).
Für transaktionale Datenbanken muss der Tabellentyp auf InnoDB oder BDB gesetzt werden.
BDB ist noch nicht fehlerfrei.
InnoDB ist ab Version 4 Default.
INNODB
Damit INNODB verfügbar ist, muss mysqld-max gestartet werden und nicht mysqld.
Im Ini-File müssen die entsprechenden Einträge stehen.
Die Verzeichnisse, die im Ini-File angegeben wurden, müssen angelegt werden (von Hand).
Alle Tabellen, die Transaktionen unterstützen sollen, müssen mit:
CREATE TABLE address TYPE=innodb;
angelegt werden, bestehende Tabellen werden mit:
CREATE TABLE address TYPE=innodb;
angepasst.
Foreign Keys
In MySQL wird die Foreign Key Syntax akzeptiert, aber nur für InnoDB-Tabellen werden auch
wirklich Foreign Keys angelegt.
Ein Foreign Key kann in MySQL nur auf ein Feld angelegt werden, auf dem ein Index besteht:
CREATE TABLE address(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB;
Variante 1
Anlegen einer Datenbank mit Foreign Key und mit Index:
CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE SET NULL
) TYPE=INNODB;
Variante 2
Anlegen einer Datenbank, dann Anlegen des Index und dann Anlegen des Foreign Key:
CREATE TABLE child(id INT, parent_id INT) TYPE=INNODB;
CREATE INDEX par_ind ON child (parent_id);
ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id);
Oracle
Allgemein
Datenbank = Datenbankname oder -instanz = Service
Server (z.B.: IP-Adresse): 111.22.33.44
Port (Default): 1521
User = username: dirk
Passwort: xxxx
SQL Plus
starten mit:
sqlplus User/Passwort
sqlplus User/Passwort@Datenbank
Wenn der Name der Datenbankinstanz nicht angegeben wurde, wird die Variable:
ORACLE_SID genutzt.
Auf dem Bildschirm wird der Tabellenheader bei zu langen Ausgaben mehrfach pro Satz ausgegeben,
dagegen hilft z.B. ein: set pages 50, dann wird der header erst nach 50 Zeilen wieder ausgegeben
Scriptstarten mit:
start Scriptname oder @ Scriptname
Rollback und Commit:
Eine Änderung an der Datenbank (Transaktion) wird erst wirksam, wenn ein commit
durchgeführt wurde.
Um eine Änderung rückgängig zu machen wird das Kommando rollback eingegeben.
Beim Beenden des sqlplus wird automatisch ein commit ausgeführt.
SQL Server 2000
Auto Increment oder Indentity Spalten
Wert einer Identity Spalte anzeigen:
DBCC CHECKIDENT (tablename)
Wert einer Identity Spalte setzt (auf 0):
DBCC CHECKIDENT (sis_dump, RESEED, 0)
Bei noch vorhandenen Datensätzen würde die Id der vorhandenen
Sätze übersprungen, beim Einfügen von neuen Sätzen.
Linked Server
Im SQL Server können beliebige transaktionale (kein MS Access) Datenbanken als Linked
Server eingebunden werden.
Diese Datenbanken können, wie SQL Server interne Datenbanken genutzt werden.
Es ist auch möglich über eine andere SQL Server Datenbank einen View zu erzeugen, der Daten über
den Linked Server bezieht.
Vorgehen
Im SQL Server Enterprise Manager Baum unter:
Security->Linked Servers, eine Verbindung auf eine andere Datenbank erstellen.
Mit dem „Microsoft OLE DB Provider for ODBC“ kann z.B. jede ODBC Datenquelle eingebunden werden,
dazu muss nur unter neuer Linked Server der Treiber, der Name für den Linked Server und der DSN
eingetragen werden.
Wenn nötig, muss auf dem Security Tab Passwort und Login eingetragen werden, z.B.:
“Be made using this security context“ auswählen und “Remot login” und “With password” eingeben.
Außerdem muss der Distributed Transaction Coordinator (MSDTC) unter Verwaltung->Dienste gestartet werden.
Um den Linked Server in einem View aufzurufen wird der Befehl OpenQuery genutzt, wenn die Datenquelle
keine weitere SQL Server Instanz ist, z.B.:
SELECT * FROM OPENQUERY(tablenname, 'SELECT * FROM address') Rowset_1
Openquery sorgt für eine Ausführung des Select Statements auf dem Zielserver und liefert einen
Recordset als Antwort. Komplexe Queries können so zeitsparend auf dem Zielserver ausgeführt werden.
Auf den Views, die Daten aus einem Linked Server anzeigen, können auch Insert-, Delete- und
Update-Statements ausgeführt werden. Beim Insert und Update besteht aber ein Problem mit
konstanten Feldern.
Auf dem folgende View kann wegen "something" kein Insert oder Update ausgeführt werden:
CREATE VIEW customer AS SELECT *, 'xxx' AS something FROM
OPENQUERY(foreignCustomerDB, 'SELECT * from foreignCustomer') Rowset_1;
Problem
Linked Server können mit OpenQuery nur für die Übertragung von kleinen Datenmengen
genutzt werden. Openquery überträgt alle Ergebnisdatensätze der Abfrage sofort an den SQL Server. Wenn
das Ergebnis aus 1 Mio. Datensätzen besteht, werden alle 1 Mio. Datensätze an den SQL Server übertragen.
|