• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gurzi

Create Table

13 mensagens neste tópico

Preciso aqui de uma ajuda..

Tenho 2 tabelas no qual uma é Autor e outra Livros..

Ou seja cada uma tem um ID e como é uma ligação de muitos para muitos, vai ser criado uma terceira tabela que vai receber o ID da tabela autor e da tabela Livro ..

mas como faço ao criar a tabela Autoria dizer que o ID AUTOR e o ID LIVRO são os IDS das outras tabelas fazendo assim uma ligaçao muitos para muitos ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi muito bem o que queres! Ligar as tabelas com constraint?

Isto?

create table [dbo].[Autor]( 
[iDAutor] int primary key identity(1,1) not null
)
GO

create table [dbo].[AutorLivro] 
(
[RefIDLivro] int not null,
[RefIDAutor] int not null,
constraint [PK_AutorLivro] primary key clustered 
(
	[RefIDLivro],
	[RefIDAutor]
)
) 
GO

CREATE TABLE [dbo].[Livro]
(
[iDLivro] int primary key identity(1,1) not null
)
GO

alter table [dbo].[AutorLivro] add 
constraint [FK_AutorLivro_Autor] foreign key 
(
[RefIDLivro]
) references [dbo].[Livro]  (
[iDLivro]
),
constraint [FK_AutorLivro_Livro] foreign key 
(
[RefIDAutor]
) references [dbo].[Autor] (
[iDAutor]
)
GO

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não sei.. é que tipo.. a tabela Autor liga a Livros e é uma ligaçao de muitos para muitos...

Quando é uma ligação de muitos para muitos é criada uma terceira tabela que recebe as 2 chaves primárias de cada tabela.. só que como é que faço essa 3 tabela e indico que os campos la dentro sao as chaves primárias das outras duas ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei qual é a base de dados que estás a usar, mas em SQL existem as Chaves estrangeiras (foreign keys), suponho que existam nas outras também, porque é uma coisa básica.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É o que está no código então. A associação das chaves está na parte ALTER TABLE. A 3ª tabela é o tal AutorLivro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Realmente... está lá FOREIGN KEY... eu é que vi tantas letras que nem me dei ao trabalho de ler  :wallbash:

Mas pronto, acho que é assim que se faz uma ligação de muitos para muitos...

Já agora isso é o quê? Access? parece muito mais complicado do que SQLSERVER (ou sou eu que já não me lembro como se criavam tabelas em SQLSERVER?)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

SQL server. É provavel que muita gente junte o código que está em ALTER TABLE na propria criação da tabela. Eu gosto mais assim, porque quando temos tabelas aos montes não somos obrigados a respeitar a ordem de criação. É que se juntares o código, e por algum motivo tentares criar as tabelas na ordem que estão... estoira! Porque Livro não existe e AutorLivro refere a tabela Livro.

Já vi muitas pessoas a tentar ordenar a criação das tabelas num script com tabelas a dar com pau,  e a ficar xone com aquilo.

Assim basta colocar todos os ALTER TABLE no fim do script e a coisa funciona sempre. As referências são sempre para tabelas já criadas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado shumy, so nao percebo o que é o dbo.

O porquê da utilização das [] e o que serve o constraint e clustered , vou procurar!

já entendi que os contrains são restrições mas nos exemplos que vi não usam a palavra constrain..

ainda não sei o que é o dbo e o clustered !

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

dbo -> database owner(dono da base de dados) normalmente o grupo a que pertecem os criadores da bd e que têm previlegios para executar todo o tipo de operações sobre aquela BD. Convem criar todos os objectos com dbo.* para que os previlegos importantes (como criar e apagar tabelas) estejam restringidos aos dbo's.

[] -> obrigatoriamente usados em nomes que contenham espaços, mas opcional noutros tipos. Como norma é uma bom abito usalos.

clustered -> usado por questões de performance, a explicação pode ser um pouco extensa por isso resumidamente, provoca uma ordenação do campo com essa propriadade aumentando a performance de algumas pesquisas. Aumenta essencialmente pesquisas que devolvam um range de dados, e especialmente em situações em que se usa 'between'. A aceleração deve-se ao facto de dados com valores iguais, ou parecidos, estarem perto uns dos outros,  basicamente em ingles (clustered) juntos.

Espero que tenha sido util.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só nao entendo o porque de fazeres [dbo] . [Autor] ..

o Autor n é o nome da tabela ? entao pk o . ?

Outra coisa, o que é o identity (1,1) ??

e porque usas alter table  e nao fazes logo tudo no create ?

Para finalizar o que está em AutorLivro n devia ter o mesmo nome que o que vem da tabela autor e livro ?

é que chamaste IDAutor e depis puseste RefIDAutor

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ficaria assim entao ? ;)

CREATE TABLE [dbo].[Autor] (
[iDAutor] int PRIMARY KEY NOT NULL AUTO_INCREMENT,
[Nome] CHAR(255) NOT NULL,
[Apelido] CHAR(255) NOT NULL)

GO

CREATE TABLE [dbo] . [Autoria] (

[iDAutor] int NOT NULL,
[iDLivro] int NOT NULL,
CONTRAINT [FK_AutorLivro] PRIMARY KEY CLUSTERED
(
[iDAutor],
[iDLivro]
)

)

GO

CREATE TABLE [dbo] . [Livro]
(

  [iDLivro] int PRIMARY KEY NOT NULL AUTO_INCREMENT,
  [Editora] CHAR(50) NOT NULL ,
  [Edicao] int NOT NULL,
  [Ano] int NOT NULL 
  
  )
  
  GO
  
  ALTER TABLE [dbo] . [AutorLivro] ADD
  
  CONSTRAINT [FK_AutorLivro_Autor] FOREIGN KEY
  (
    [iDLivro]
)
  REFERENCES [dbo].[Livro] (
    [iDLivro]
    ),
    
    CONSTRAINT [FK_AutorLivro_Livro] FOREIGN KEY
    (
    
    [iDAutor]
    )
    REFERENCES [dbo].[Autor]
    (
    [iDAutor]
    )
    GO

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epá tanta questão!

Ponto para separar nomes é como nas linguagens orientadas a objectos! dbo.X, dbo.Y tabela X e Y pertencentes ao grupo dbo.

identity (1,1) é indica que o campo é incrementado automaticamente de 1 em 1 com inicio em 1. Não presisas de inserir esse campo nos inserts, é automático.

Quanto ao alter table já foi explicado anteriormente. Quando tiveres muitos create tables com referências, experimenta trocar a ordem de criação para ver o que acontece. Se tiveres muitas mesmo vas te ver lixado para por aquilo a funcionar outra vez.

IDAutor -> chave primária. RefIDAutor -> chave estrangeira, ou seja referencia outra chave primária (Ref -> referência a!) é uma convenção usada por mim para manter as coisas em ordem.

Podes utilizar outra convenção qualquer. Mas aconselho a separar as coisas. É que as chaves primárias garentem que são unicas e as estrangeiras não. Se tiveres o mesmo nome podes-te enganar a fazer alguma query, partindo do pressuposto que aquele campo deveria ser unico.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora