tengo un programa en el cual uso una base de datos sql server.
la base de datos tiene 5 tablas, pero digamos que tiene en un momento una tabla llamada personas y otras dos que estan conectadas con esta. el tema es que desde mi aplicacion quiero cambiar el valor de la llave primaria DNI en cualquier tabla y quisiera que en primer lugar me deje hacerlo, y en segundo lugar que se actualice el valor de la llave primaria en todas las tablas que dependen de la tabla maestro del dni.
estuve investingando pero esto no estoy seguro de como hacerlo
algunos mensajes que me parecieron interesantes:
Citar
Realmente no se puede cambiar de forma directo.
Lo que tendrias que hacer es crear nuevamente en labla padre nuevamente el registro y luego en la tabla hija. finalmente eliminar de las dos tablas el registro viejo.
La otra opción es eliminar primero el constraint que une las dos tablas, hacer el update en las dos tablas y volver a crear el contraint.
Lo que tendrias que hacer es crear nuevamente en labla padre nuevamente el registro y luego en la tabla hija. finalmente eliminar de las dos tablas el registro viejo.
La otra opción es eliminar primero el constraint que une las dos tablas, hacer el update en las dos tablas y volver a crear el contraint.
Citar
Si hay "dependencias" de la clave primaria, cada motor reaccionará de manera diferente ante la situación. En el caso particular de interbase, no te deja eliminar la clave primaria, no por el riesgo de perdida de información que has mencionado, sino porque las llaves foraneas no pueden quedar huerfanas, en el sentido de que no tienen a donde apuntar.
Por ello, es necesario que primero borres todas las llaves foraneas, luego la llave primaria, crees la nueva y después crees las nuevas llaves foraneas (si existen).
Aprovecho para comentar también que una llave primaria puede eliminarse no solo con su nombre (drop constraint), pero también con la instrucción:
Código SQL [-]
Alter table nombre_tabla drop primary key;
Por último, motores como Oracle han introducido alguna forma de eliminar automáticamente las dependencias. En el caso específico de Oracle la instrucción es:
Código SQL [-]
Alter table nombre_tabla drop primary key cascade constraints;
Hasta luego.
Por ello, es necesario que primero borres todas las llaves foraneas, luego la llave primaria, crees la nueva y después crees las nuevas llaves foraneas (si existen).
Aprovecho para comentar también que una llave primaria puede eliminarse no solo con su nombre (drop constraint), pero también con la instrucción:
Código SQL [-]
Alter table nombre_tabla drop primary key;
Por último, motores como Oracle han introducido alguna forma de eliminar automáticamente las dependencias. En el caso específico de Oracle la instrucción es:
Código SQL [-]
Alter table nombre_tabla drop primary key cascade constraints;
Hasta luego.
Citar
Tengo una duda respecto a la instrucción que habeis puesto antes.
Tengo una tabla en paradox con una clave primaria puesta que quiero modificar.
Si esta tabla tuviera un indice secundario sabría que su nombre sería por ej 'idescripcion' para poder buscar la descripcion pero que nombre tiene una clave primaria?
ALTER TABLE "TABLA" DROP CONSTRAINT "CLAVE PRIMARIA"
de esta instrucción puedo poner
"Tabla" el nombre de mi tabla Tabla.Db
Pero en "Clave primaria"? mmm esto no lo comprendo
Muchas gracias
Tengo una tabla en paradox con una clave primaria puesta que quiero modificar.
Si esta tabla tuviera un indice secundario sabría que su nombre sería por ej 'idescripcion' para poder buscar la descripcion pero que nombre tiene una clave primaria?
ALTER TABLE "TABLA" DROP CONSTRAINT "CLAVE PRIMARIA"
de esta instrucción puedo poner
"Tabla" el nombre de mi tabla Tabla.Db
Pero en "Clave primaria"? mmm esto no lo comprendo
Muchas gracias
Citar
si pero tb tendrias q actualizar las tablas a las cuales esta relacionada
Citar
You don't have to give ON DELETE CASCADE or ON UPDATE CASCADE to foreign key. Basically,
this is given on the primary key to say that if the record (in primary key table) is deleted or updated,
reflect the changes in all the tables where the primary key table is referenced via foriegn key.
references Alumnos(DNI) ON UPDATE CASCADE ON DELETE CASCADE
esta es la informacion que he eonctrado en la web, pero no estoy seguro de como hacerlo ya que osy nuevo en esto.
mi codigo de las tablas
Código:
create table Localidades(
codLocalidad int primary key not null identity(1,1),
Localidad nchar (50) not null,
Provincia nchar (50) not null
)
go
create table Personas(
DNI int primary key not null,
Nombre nchar (50) not null,
Apellido nchar (50) not null,
codLocalidad int not null,
constraint FK_Personas1 foreign key (codLocalidad) references Localidades(codLocalidad)
)
go
create table Capacitaciones(
codCapacitacion char (5) not null,
NombreCapacitacion nchar (50) not null,
FechaInicio smalldatetime,
FechaFin smalldatetime,
constraint PK_Capacitacion1 primary key(codCapacitacion)
)
go
create table Capacitacion_Por_Persona(
codCapacitacion char (5) not null,
DNI int not null,
constraint PK_Capacitacion primary key(codCapacitacion,DNI),
constraint FK_Capacitacion_Por_Persona1 foreign key (codCapacitacion) references Capacitaciones(codCapacitacion),
constraint FK_Capacitacion_Por_Persona2 foreign key (DNI) references Personas(DNI)
)
yo quisiera desde mi programa cambiar el dni en cualquier tabla y si es llave primaria en dicha tabla o no, de cualquier forma que se actualice. agradeceria su ayuda gentilmente
como lo puedo hacer?