CREATE TABLE <name> LIKE <name> importando primary keys and foreign keys

Iniciado por Kasswed, 28 Enero 2010, 03:29 AM

0 Miembros y 1 Visitante están viendo este tema.

Kasswed

Hello there.

I'm looking for some statement to import the fact that an attribute is a primary key or a foreign key when I use the CREATE TABLE LIKE statement.

El caso es que puedo copiar las tablas pero no hay manera de que me copie también el hecho de que un atributo es clave primaria o externa, y después de tanto buscar ya no sé si quiera si eso será posible.

Estoy usando una base de datos DB2.

Gracias.
"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

^Tifa^

Si se puede hacer, yo particularmente no puedo confirmaterlo porque lo desconozco  ;)
Pero, hasta lo que me concierne.

CREATE TABLE <tabla> LIKE....
No copia ni porta ninguno de los registros (data) ni indices de la tabla padre (digase de la tabla a la cual le estas haciendo la copia) en su lugar se te crea una tabla con la misma estructura logica de la tabla padre (nombre de los campos) pero vacia.

CREATE TABLE <tabla> AS SELECT...
Esta te hace una copia de la tabla padre con todos los registros(data) que esta contenga asi como la estructura logica de la tabla padre (nombre de los campos). Pero como la anterior no respeta los indices ni llaves primarias ni foraneas nada nada...

Que he solido hacer en estos casos? Utilizar CREATE TABLE <tabla> ... AS SELECT ...  y una vez creada la tabla copia, proceder a alterarla para especificarle cual es el foreign key y a que campo hara referencia como clave padre:

ALTER TABLE <tabla> ADD FOREIGN KEY(campo de la tabla clonada que es primary) REFERENCES <tabla_padre>(campo primary de la tabla padre) ON DELETE CASCADE;

Con lo anterior y si el motor es transaccional que asumo que si, pues comienza a respetarse las leyes de las llaves foraneas he indices de padre a hijo. Al menos esto es asi en MySQL y Oracle, si existe una manera fija de hacerlo con CREATE TABLE... bien, pero yo particularmente no la conozco, si alguien conoce una via mas sencilla bienvenida sea. Yo utilizo ALTER por ser un estandar SQL y por servirme en cualquier Base de Datos relacional compatible con el ANSI SQL, y pues no utilizar un estandar fijo de un motor para este tipo de cosas.

Un saludo.

ssccaann43 ©

Si es SQL Server, es así...

ALTER TABLE [dbo].[TABLA] WITH NOCHECK ADD
   CONSTRAINT [PK_TABLA] PRIMARY KEY  CLUSTERED
   (
      [Campo]
   )  ON [PRIMARY]
GO

Y tifa lo mejor es usar Alter Table para estos casos...!
- Miguel Núñez
Todos tenemos derechos a ser estupidos, pero algunos abusan de ese privilegio...
"I like ^TiFa^"