Dirk Lubahn Freiberufler Knowledge-Base Privat Links
Knowledge-Base / Datenbanken
Info
Betriebssysteme
Sprachen
Techniken
Datenbanken
Netzwerke
Tools

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.
Es wird kein Anspruch auf inhaltliche Richtigkeit oder Vollständigkeit der Seiten erhoben.
Die Seit: "http://www.dlubahn.de/knowledge/database.htm" wurde zuletzt geändert am 08.10.2004 von Dirk Lubahn.