Jump to content
Cleudiney T Brandão

Criar coluna em tabela que aceite NULL e UNIQUE

Recommended Posts

Pessoal alguém me dá uma ajuda com Mysql por favor.
Tenho uma coluna em meu BD que precisaria o seguinte: 
Ela não é obrigatória mas se preenchida não poderia ter outras ocorrências dela.
É um campo que ao meu ver seria UNIQUE mas que aceitasse NULL.

Share this post


Link to post
Share on other sites

UNIQUE aceita normalmente "parâmetros" nulos em sua coluna,

segue exemplo:

 

SQL

CREATE TABLE users (
  idUser INT NOT NULL AUTO_INCREMENT,
  nome VARCHAR(100) NOT NULL,
  chave INT,
  PRIMARY KEY(idUser),
  UNIQUE (chave)
);

INSERT INTO users (nome, chave) VALUES 
('Jadson e Judson', 29992),
('Judson e Jadson', NULL),
('Judson', NULL);

 

RESULTADO

image.png.0e3fbbbff3200c5a9b4b10b9e442d845.png

Share this post


Link to post
Share on other sites

Crie uma verificação, segue exemplo:

 

CÓDIGO

<?php
	if ( $_POST ) {
		# VERIFICA O POST 'CAMPO' CHAVE
		if ( $_POST [ 'chave' ] == 0 ) {
			$_POST [ 'chave' ] = NULL;
		}

		$pdo = new PDO ( 'mysql:host=localhost;dbname=imasters', 'root', '' );
		$pdo->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

		$stmt = $pdo->prepare ( 'INSERT INTO users (nome, chave) VALUES (?, ?)' );
		$stmt->bindValue (1, $_POST [ 'nome' ]);
		$stmt->bindValue (2, $_POST [ 'chave' ]);
		$stmt->execute ();

		if ( $stmt->rowCount () > 0 ) {
			$stmt = $pdo->prepare ( 'SELECT * FROM users' );
			$stmt->execute ();

			$ret = $stmt->fetchAll ( PDO::FETCH_OBJ );

			echo "<pre>";
			var_dump (
				$ret
			);
		}
	}
?>

<!DOCTYPE html>
<html>
	<head>
		<title> EXAMPLE </title>
	</head>

	<body>
		<form action="#" method="post">
			<label>Nome: </label>
			<input type="text" name="nome" />
			<br />
			<label>Chave: </label>
			<input type="number" name="chave" />
			<br />
			<br />
			<input type="submit" value="enviar" />
		</form>
	</body>
</html>

 

Share this post


Link to post
Share on other sites

Disponível ;)

 

E sim, existe sim! O SQL tem funções de verificação também, porém acho até mais fácil por PHP rsrsrs

Share this post


Link to post
Share on other sites
14 horas atrás, Cleudiney T Brandão disse:

porém quando ele vém de um POST e não está preenchido o mysql o assume como 0 e avisa que o campo é duplicado.

Se o comando INSERT tiver nulo fica nulo no Banco !

Share this post


Link to post
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

  • Similar Content

    • By Duilio Gomes Pereira
      Tenho um banco de dados com mais de 21 mil usuários do wordpress. Como faço para deletar os usuário no  Phpmyadmin e deixar apenas 2 usuários?
       
      Pois só preciso de 2 usuários neste site.
       
      Obrigado!
    • By Duilio Gomes Pereira
      Olá!
      Tenho um bando de dados com mais de 21 mil usuários do wordpress. Como faço para deletar no Phpmyadmin e deixar apenas 2 usuários?
      Obrigado!
    • By Junior SAIZO
      Estou com uma duvida na qual não obtive solução. Tenho um objeto Array values e um array status, onde eu quero relacionar os índices do objeto Array values aos indices do array status. De modo que eu possa escrever um teste lógico onde: Se o indice 0 do objeto Array values for diferente de null (ou seja, contém valor), então o indice 0 do array status receberá o valor '1'.
      OU 
      Se o indice 1 do objeto Array values for diferente de null (ou seja, contém valor), então o indice 1 do array status receberá o valor 1.
       
      Por exemplo, antes do teste lógico:
      values:[ 0 => [ 0 => "1,02" 1 => "2,032" 2 => "32,01" 3 => "0,021" ] 1 => [ 0 => "null" 1 => "null" 2 => "8,258" 3 => "1,021" ] 2 => [ 0 => "4,021" 1 => "6,258" 2 => "null" 3 => "10" ] ] status:[ 0 => "0" 1 => "0" 2 => "0" ] Após o teste lógico:
       
      status:[   0 => "1"   1 => "0"   2 => "0" ] Neste exemplo só o indice 0 do array status recebeu o valor "1", porque APENAS o array 0 do objeto Array values tinha valores diferente de null.
       
      ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       
      O array status sempre terá o mesmo número de índices que o objeto Array values terá de arrays (Se array status tem 5 indices (0, 1, 2, 3, 4), o objeto Array value terá 5 arrays (0, 1, 2, 3, 4)). Além disso o array status sempre iniciará com os valores do indice igual a '0'. E se os valores dos indices do objeto values forem TODOS diferentes de null, cada indice do array status receberá o valor '1'.
       
      Exemplificando:

       
      <?php status:[   0 => "1",   1 => "1",   2 => "1", ] ?>  
       
      Em outro fórum obtive a seguinte resposta:
       
      <?php $aValues = [ 0 => [ 0 => "1,023" , 1 => "0,023" , 2 => "5,023" , 3 => "1" ], 1 => [ 0 => null , 1 => null , 2 => "5" , 3 => "1,87" ], 2 => [ 0 => "null" , 1 => null , 2 => null , 3 => null ] ]; $aStatus = [ 0 => 0 , 1 => 0 , 2 => 0 ]; foreach ($aValues as $chave => $values) { $status = 1; foreach ($values as $value) { // se tiver qquer valor null status recebe 0 if ($value == null) { $status = 0; break; } } $aStatus[$chave] = $status; } echo '<pre>'; print_r($aStatus); ?> Porém, quando eu executo o código NÂO é me retornado o array status com os indices com valores "0" ou "1", me retorna apenas uma nova chave FORA do array status com algum valor "0" ou "1". Tentei modificar o código ou tentar uma abordagem diferente, mas sem resultado. Vou inserir uma imagem para melhor compreensão do que o código me retorna.
       
       
      Espero ter sido claro na minha dúvida.  
      Desde já, agradeço.

    • By Giovanird
      Estou quebrando a cabeça para fazer uma consulta em 2 colunas da mesma tabela.
      Preciso retornar a NOTA1 e NOTA2 consultando ambas colunas e listar sem repetir as notas vinculadas com cada série.

      TABELA ALUNOS
      COD |    CODSERIE  |  DATACADASTRO  |  NOTA1  |  NOTA2  
      1       |    2                  |  01/08/2021           |  5            |  3
      2       |    1                  |  11/08/2021           |  3            |  5
      3       |    2                  |  12/08/2021           |  5            |  3
      4       |    3                  |  15/08/2021           |  3            |  1
      5       |    2                  |  15/08/2021           |  5            |  3
      6       |    3                  |  18/08/2021           |  4            |  5
      7       |   2                   |  22/08/2021           |  2            |  3
      8       |   1                   |  12/08/2021           |  1            |  3
      9       |   2                   |  25/08/2021           |  5            |  6

      RETORNAR:
      SERIE 1
      Nota: 3
      Nota: 5
      Nota: 1
       
      SERIE 2
      Nota: 5
      Nota: 3
      Nota: 2
      Nota: 6
       
      SERIE 3
      Nota: 3
      Nota: 1
      Nota: 4
      Nota: 5
       
      Aqui tenho um foreach de outra tabela que devolve o codigo das séries e as notas para consulta foreach($rsserie as list($varserie,$varnota1,$varnota2)){ SELECT nota1, nota2 FROM alunos WHERE codserie like '$varserie' and (nota1 = '$varnota1' or nota1 = '$varnota2' or nota2 = '$varnota1' or nota2 = '$varnota2') Group by nota1, nota2 }  
    • By TheRonaldoStar
      Olá, gostaria de saber como faço para fazer um select em uma tabela de usuários e retornar todos os registro e fazer uma contagem de quantos amigos o usuário tem.
      Por exemplo:
      | ID | Nome | Amigo(ID) | Amigos | | 1 | Ronaldo | null | 3 | | 2 | Teste1 | 1 | 0 | | 3 | Teste2 | 1 | 0 | | 4 | Teste3 | 1 | 2 | | 5 | Teste4 | 4 | 0 | | 6 | Teste5 | 4 | 1 | | 7 | Teste6 | 6 | 0 |  
      Agradeço a ajuda desde já. Já fiz horas de pesquisa e até agora não encontrei nada que resolvesse 100%.
       
      Isso acho que resolveria o meu cado mais dá um erro:  #1054 - Coluna 'p1.id' desconhecida em 'where clause'
      SELECT * FROM `users` p1 INNER JOIN (SELECT COUNT(friend) AS friends FROM `users` p2 WHERE (p2.friend = p1.id)) p3 ON (p1.friend = 2);  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.