Jump to content

Create Table


Gurzi

Recommended Posts

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 ?

Link to comment
Share on other 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

Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Link to comment
Share on other 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 ?

Link to comment
Share on other 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?)

Link to comment
Share on other 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.

Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Link to comment
Share on other 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.

Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Link to comment
Share on other 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

Link to comment
Share on other 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
Link to comment
Share on other 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.

Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.